rozod 6.4.1 → 6.5.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.
- package/lib/endpoints/authv1.d.ts +3 -0
- package/lib/endpoints/authv1.js +3 -0
- package/lib/endpoints/authv2.d.ts +2 -0
- package/lib/endpoints/authv2.js +2 -0
- package/lib/endpoints/avatarv2.d.ts +22 -0
- package/lib/endpoints/avatarv2.js +24 -1
- package/lib/endpoints/catalogv1.d.ts +1 -0
- package/lib/endpoints/catalogv1.js +1 -0
- package/lib/endpoints/catalogv2.d.ts +1 -0
- package/lib/endpoints/catalogv2.js +1 -0
- package/lib/endpoints/friendsv1.d.ts +42 -0
- package/lib/endpoints/friendsv1.js +37 -1
- package/lib/endpoints/gameinternationalizationv1.d.ts +40 -0
- package/lib/endpoints/gameinternationalizationv1.js +42 -1
- package/lib/endpoints/gamesv1.d.ts +345 -0
- package/lib/endpoints/gamesv1.js +380 -1
- package/lib/endpoints/gamesv2.d.ts +188 -141
- package/lib/endpoints/gamesv2.js +41 -1
- package/lib/endpoints/groupsv1.d.ts +2 -0
- package/lib/endpoints/groupsv1.js +2 -0
- package/lib/endpoints/groupsv2.d.ts +150 -0
- package/lib/endpoints/groupsv2.js +146 -1
- package/lib/endpoints/itemconfigurationv1.d.ts +42 -0
- package/lib/endpoints/itemconfigurationv1.js +39 -1
- package/lib/endpoints/twostepverificationv1.d.ts +2 -0
- package/lib/endpoints/twostepverificationv1.js +2 -0
- package/lib/index.js +1 -1
- package/lib/opencloud/v1/messaging.d.ts +2 -0
- package/lib/opencloud/v1/messaging.js +2 -0
- package/lib/opencloud/v2/cloud.d.ts +0 -5
- package/lib/opencloud/v2/cloud.js +0 -5
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getUsersUseridGroupsRoles = exports.postGroupsGroupidWallPosts = exports.getGroupsGroupidWallPosts = exports.getGroupsGroupidExperiences = exports.getGroups = void 0;
|
|
3
|
+
exports.getUsersUseridGroupsRoles = exports.postGroupsGroupidWallPosts = exports.getGroupsGroupidWallPosts = exports.getGroupsGroupidRelationshipsGrouprelationshiptypeRequests = exports.getGroupsGroupidRelationshipsGrouprelationshiptype = exports.getGroupsGroupidExperiences = exports.getGroups = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const __1 = require("..");
|
|
6
6
|
const Roblox_Web_Responses_RelatedEntityTypeResponse_Roblox_Web_Responses_Groups_GroupOwnerType_ = zod_1.z.object({
|
|
@@ -136,6 +136,35 @@ const Roblox_Groups_Api_Models_Response_UserModel = zod_1.z.object({
|
|
|
136
136
|
username: zod_1.z.string(),
|
|
137
137
|
displayName: zod_1.z.string(),
|
|
138
138
|
});
|
|
139
|
+
const Roblox_Groups_Api_ShoutResponse = zod_1.z.object({
|
|
140
|
+
body: zod_1.z.string(),
|
|
141
|
+
poster: Roblox_Groups_Api_Models_Response_UserModel,
|
|
142
|
+
created: zod_1.z.string().datetime({ offset: true }),
|
|
143
|
+
updated: zod_1.z.string().datetime({ offset: true }),
|
|
144
|
+
});
|
|
145
|
+
const Roblox_Groups_Api_GroupDetailResponse = zod_1.z.object({
|
|
146
|
+
id: zod_1.z.number().int(),
|
|
147
|
+
name: zod_1.z.string(),
|
|
148
|
+
description: zod_1.z.string(),
|
|
149
|
+
owner: Roblox_Groups_Api_Models_Response_UserModel,
|
|
150
|
+
shout: Roblox_Groups_Api_ShoutResponse,
|
|
151
|
+
memberCount: zod_1.z.number().int(),
|
|
152
|
+
isBuildersClubOnly: zod_1.z.boolean(),
|
|
153
|
+
publicEntryAllowed: zod_1.z.boolean(),
|
|
154
|
+
isLocked: zod_1.z.boolean(),
|
|
155
|
+
hasVerifiedBadge: zod_1.z.boolean(),
|
|
156
|
+
hasSocialModules: zod_1.z.boolean(),
|
|
157
|
+
});
|
|
158
|
+
const Roblox_Web_WebAPI_Models_ApiPageResponse_Roblox_Groups_Api_GroupDetailResponse_ = zod_1.z.object({
|
|
159
|
+
previousPageCursor: zod_1.z.string(),
|
|
160
|
+
nextPageCursor: zod_1.z.string(),
|
|
161
|
+
data: zod_1.z.array(Roblox_Groups_Api_GroupDetailResponse),
|
|
162
|
+
});
|
|
163
|
+
const Roblox_Groups_Api_Models_Response_GroupRelationshipsV2Response = zod_1.z.object({
|
|
164
|
+
groupId: zod_1.z.number().int(),
|
|
165
|
+
relationshipType: zod_1.z.enum(['Allies', 'Enemies']),
|
|
166
|
+
groupResponses: Roblox_Web_WebAPI_Models_ApiPageResponse_Roblox_Groups_Api_GroupDetailResponse_,
|
|
167
|
+
});
|
|
139
168
|
const Roblox_Groups_Api_GroupRoleResponse = zod_1.z.object({
|
|
140
169
|
id: zod_1.z.number().int(),
|
|
141
170
|
name: zod_1.z.string(),
|
|
@@ -282,6 +311,122 @@ exports.getGroupsGroupidExperiences = (0, __1.endpoint)({
|
|
|
282
311
|
},
|
|
283
312
|
],
|
|
284
313
|
});
|
|
314
|
+
/**
|
|
315
|
+
* @api GET https://groups.roblox.com/v2/groups/:groupId/relationships/:groupRelationshipType
|
|
316
|
+
* @summary Gets a group's relationships with cursor-based pagination.
|
|
317
|
+
* @param groupId The group Id.
|
|
318
|
+
* @param groupRelationshipType The group relationship type, enemies or allies.
|
|
319
|
+
* @param limit The number of results per request.
|
|
320
|
+
* @param cursor The paging cursor for the previous or next page.
|
|
321
|
+
* @param sortOrder The order the results are sorted in.
|
|
322
|
+
*/
|
|
323
|
+
exports.getGroupsGroupidRelationshipsGrouprelationshiptype = (0, __1.endpoint)({
|
|
324
|
+
method: 'GET',
|
|
325
|
+
path: '/v2/groups/:groupId/relationships/:groupRelationshipType',
|
|
326
|
+
baseUrl: 'https://groups.roblox.com',
|
|
327
|
+
requestFormat: 'json',
|
|
328
|
+
serializationMethod: {
|
|
329
|
+
groupId: {
|
|
330
|
+
style: 'simple',
|
|
331
|
+
},
|
|
332
|
+
groupRelationshipType: {
|
|
333
|
+
style: 'simple',
|
|
334
|
+
},
|
|
335
|
+
limit: {
|
|
336
|
+
style: 'form',
|
|
337
|
+
explode: true,
|
|
338
|
+
},
|
|
339
|
+
cursor: {
|
|
340
|
+
style: 'form',
|
|
341
|
+
explode: true,
|
|
342
|
+
},
|
|
343
|
+
sortOrder: {
|
|
344
|
+
style: 'form',
|
|
345
|
+
explode: true,
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
parameters: {
|
|
349
|
+
groupId: zod_1.z.number().int(),
|
|
350
|
+
groupRelationshipType: zod_1.z.string(),
|
|
351
|
+
limit: zod_1.z
|
|
352
|
+
.union([zod_1.z.literal(10), zod_1.z.literal(25), zod_1.z.literal(50), zod_1.z.literal(100)])
|
|
353
|
+
.optional()
|
|
354
|
+
.default(10),
|
|
355
|
+
cursor: zod_1.z.string().optional(),
|
|
356
|
+
sortOrder: zod_1.z.enum(['Asc', 'Desc']).optional().default('Asc'),
|
|
357
|
+
},
|
|
358
|
+
response: Roblox_Groups_Api_Models_Response_GroupRelationshipsV2Response,
|
|
359
|
+
errors: [
|
|
360
|
+
{
|
|
361
|
+
status: 400,
|
|
362
|
+
description: `1: Group is invalid or does not exist.
|
|
363
|
+
4: Group relationship type or request type is invalid.
|
|
364
|
+
8: Invalid or missing pagination parameters`,
|
|
365
|
+
},
|
|
366
|
+
],
|
|
367
|
+
});
|
|
368
|
+
/**
|
|
369
|
+
* @api GET https://groups.roblox.com/v2/groups/:groupId/relationships/:groupRelationshipType/requests
|
|
370
|
+
* @summary Gets a group's relationship requests with cursor-based pagination.
|
|
371
|
+
* @param groupId The group Id.
|
|
372
|
+
* @param groupRelationshipType The group relationship type of the request, only allies are supported.
|
|
373
|
+
* @param limit The number of results per request.
|
|
374
|
+
* @param cursor The paging cursor for the previous or next page.
|
|
375
|
+
* @param sortOrder The order the results are sorted in.
|
|
376
|
+
*/
|
|
377
|
+
exports.getGroupsGroupidRelationshipsGrouprelationshiptypeRequests = (0, __1.endpoint)({
|
|
378
|
+
method: 'GET',
|
|
379
|
+
path: '/v2/groups/:groupId/relationships/:groupRelationshipType/requests',
|
|
380
|
+
baseUrl: 'https://groups.roblox.com',
|
|
381
|
+
requestFormat: 'json',
|
|
382
|
+
serializationMethod: {
|
|
383
|
+
groupId: {
|
|
384
|
+
style: 'simple',
|
|
385
|
+
},
|
|
386
|
+
groupRelationshipType: {
|
|
387
|
+
style: 'simple',
|
|
388
|
+
},
|
|
389
|
+
limit: {
|
|
390
|
+
style: 'form',
|
|
391
|
+
explode: true,
|
|
392
|
+
},
|
|
393
|
+
cursor: {
|
|
394
|
+
style: 'form',
|
|
395
|
+
explode: true,
|
|
396
|
+
},
|
|
397
|
+
sortOrder: {
|
|
398
|
+
style: 'form',
|
|
399
|
+
explode: true,
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
parameters: {
|
|
403
|
+
groupId: zod_1.z.number().int(),
|
|
404
|
+
groupRelationshipType: zod_1.z.string(),
|
|
405
|
+
limit: zod_1.z
|
|
406
|
+
.union([zod_1.z.literal(10), zod_1.z.literal(25), zod_1.z.literal(50), zod_1.z.literal(100)])
|
|
407
|
+
.optional()
|
|
408
|
+
.default(10),
|
|
409
|
+
cursor: zod_1.z.string().optional(),
|
|
410
|
+
sortOrder: zod_1.z.enum(['Asc', 'Desc']).optional().default('Asc'),
|
|
411
|
+
},
|
|
412
|
+
response: Roblox_Groups_Api_Models_Response_GroupRelationshipsV2Response,
|
|
413
|
+
errors: [
|
|
414
|
+
{
|
|
415
|
+
status: 400,
|
|
416
|
+
description: `1: Group is invalid or does not exist.
|
|
417
|
+
4: Group relationship type or request type is invalid.
|
|
418
|
+
8: Invalid or missing pagination parameters`,
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
status: 401,
|
|
422
|
+
description: `0: Authorization has been denied for this request.`,
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
status: 403,
|
|
426
|
+
description: `5: You don't have permission to manage this group's relationships.`,
|
|
427
|
+
},
|
|
428
|
+
],
|
|
429
|
+
});
|
|
285
430
|
/**
|
|
286
431
|
* @api GET https://groups.roblox.com/v2/groups/:groupId/wall/posts
|
|
287
432
|
* @summary Gets a list of group wall posts.
|
|
@@ -336,3 +336,45 @@ export const getItemTagsMetadata = endpoint({
|
|
|
336
336
|
},
|
|
337
337
|
],
|
|
338
338
|
});
|
|
339
|
+
|
|
340
|
+
// Patched endpoints removed from Roblox API docs (v6.1.0 compat)
|
|
341
|
+
|
|
342
|
+
const Patch_ApiArrayResponse_TagDetails = z.object({
|
|
343
|
+
data: z.array(Roblox_ItemConfiguration_Api_TagDetails),
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
export const getTags = endpoint({
|
|
347
|
+
method: 'GET',
|
|
348
|
+
path: '/v1/tags',
|
|
349
|
+
baseUrl: 'https://itemconfiguration.roblox.com',
|
|
350
|
+
requestFormat: 'json',
|
|
351
|
+
serializationMethod: { tagIds: { style: 'form' } },
|
|
352
|
+
parameters: { tagIds: z.array(z.string()) },
|
|
353
|
+
response: Patch_ApiArrayResponse_TagDetails,
|
|
354
|
+
errors: [
|
|
355
|
+
{ status: 400, description: `1: No tag Ids requested\n2: Too many tag Ids requested` },
|
|
356
|
+
{ status: 429, description: `3: Too many requests` },
|
|
357
|
+
],
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
export const getTagsPrefixSearch = endpoint({
|
|
361
|
+
method: 'GET',
|
|
362
|
+
path: '/v1/tags/prefix-search',
|
|
363
|
+
baseUrl: 'https://itemconfiguration.roblox.com',
|
|
364
|
+
requestFormat: 'json',
|
|
365
|
+
serializationMethod: {
|
|
366
|
+
prefix: { style: 'form', explode: true },
|
|
367
|
+
numberOfResults: { style: 'form', explode: true },
|
|
368
|
+
},
|
|
369
|
+
parameters: {
|
|
370
|
+
prefix: z.string(),
|
|
371
|
+
numberOfResults: z.number().int(),
|
|
372
|
+
},
|
|
373
|
+
response: Patch_ApiArrayResponse_TagDetails,
|
|
374
|
+
errors: [
|
|
375
|
+
{ status: 400, description: `5: The given prefix is invalid\n6: The number of results requested is invalid` },
|
|
376
|
+
{ status: 401, description: `0: Authorization has been denied for this request.` },
|
|
377
|
+
{ status: 403, description: `4: This endpoint is not yet enabled for the current user` },
|
|
378
|
+
{ status: 429, description: `3: Too many requests` },
|
|
379
|
+
],
|
|
380
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getItemTagsMetadata = exports.deleteItemTagsItemtagid = exports.postItemTags = exports.getItemTags = exports.getCreationsGetAssets = exports.postCreationsGetAssetDetails = void 0;
|
|
3
|
+
exports.getTagsPrefixSearch = exports.getTags = exports.getItemTagsMetadata = exports.deleteItemTagsItemtagid = exports.postItemTags = exports.getItemTags = exports.getCreationsGetAssets = exports.postCreationsGetAssetDetails = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const __1 = require("..");
|
|
6
6
|
const Roblox_ItemConfiguration_Api_AssetCreationsResponse = zod_1.z.object({
|
|
@@ -330,3 +330,41 @@ exports.getItemTagsMetadata = (0, __1.endpoint)({
|
|
|
330
330
|
},
|
|
331
331
|
],
|
|
332
332
|
});
|
|
333
|
+
// Patched endpoints removed from Roblox API docs (v6.1.0 compat)
|
|
334
|
+
const Patch_ApiArrayResponse_TagDetails = zod_1.z.object({
|
|
335
|
+
data: zod_1.z.array(Roblox_ItemConfiguration_Api_TagDetails),
|
|
336
|
+
});
|
|
337
|
+
exports.getTags = (0, __1.endpoint)({
|
|
338
|
+
method: 'GET',
|
|
339
|
+
path: '/v1/tags',
|
|
340
|
+
baseUrl: 'https://itemconfiguration.roblox.com',
|
|
341
|
+
requestFormat: 'json',
|
|
342
|
+
serializationMethod: { tagIds: { style: 'form' } },
|
|
343
|
+
parameters: { tagIds: zod_1.z.array(zod_1.z.string()) },
|
|
344
|
+
response: Patch_ApiArrayResponse_TagDetails,
|
|
345
|
+
errors: [
|
|
346
|
+
{ status: 400, description: `1: No tag Ids requested\n2: Too many tag Ids requested` },
|
|
347
|
+
{ status: 429, description: `3: Too many requests` },
|
|
348
|
+
],
|
|
349
|
+
});
|
|
350
|
+
exports.getTagsPrefixSearch = (0, __1.endpoint)({
|
|
351
|
+
method: 'GET',
|
|
352
|
+
path: '/v1/tags/prefix-search',
|
|
353
|
+
baseUrl: 'https://itemconfiguration.roblox.com',
|
|
354
|
+
requestFormat: 'json',
|
|
355
|
+
serializationMethod: {
|
|
356
|
+
prefix: { style: 'form', explode: true },
|
|
357
|
+
numberOfResults: { style: 'form', explode: true },
|
|
358
|
+
},
|
|
359
|
+
parameters: {
|
|
360
|
+
prefix: zod_1.z.string(),
|
|
361
|
+
numberOfResults: zod_1.z.number().int(),
|
|
362
|
+
},
|
|
363
|
+
response: Patch_ApiArrayResponse_TagDetails,
|
|
364
|
+
errors: [
|
|
365
|
+
{ status: 400, description: `5: The given prefix is invalid\n6: The number of results requested is invalid` },
|
|
366
|
+
{ status: 401, description: `0: Authorization has been denied for this request.` },
|
|
367
|
+
{ status: 403, description: `4: This endpoint is not yet enabled for the current user` },
|
|
368
|
+
{ status: 429, description: `3: Too many requests` },
|
|
369
|
+
],
|
|
370
|
+
});
|
|
@@ -29,9 +29,11 @@ const Roblox_TwoStepVerification_Api_MetadataResponse = z.object({
|
|
|
29
29
|
isSettingsTabRedesignEnabled: z.boolean(),
|
|
30
30
|
twoStepCopyTextEnrollmentStatus: z.number().int(),
|
|
31
31
|
isEppUIEnabled: z.boolean(),
|
|
32
|
+
isEppRecoveryCodesEnabled: z.boolean(),
|
|
32
33
|
maskedUserEmail: z.string(),
|
|
33
34
|
isUserU13: z.boolean(),
|
|
34
35
|
isDelayedUiEnabled: z.boolean(),
|
|
36
|
+
is2svRecoveryEnabled: z.boolean(),
|
|
35
37
|
});
|
|
36
38
|
const Roblox_TwoStepVerification_Api_UserConfigurationMethod = z.object({
|
|
37
39
|
mediaType: z.enum([
|
|
@@ -31,9 +31,11 @@ const Roblox_TwoStepVerification_Api_MetadataResponse = zod_1.z.object({
|
|
|
31
31
|
isSettingsTabRedesignEnabled: zod_1.z.boolean(),
|
|
32
32
|
twoStepCopyTextEnrollmentStatus: zod_1.z.number().int(),
|
|
33
33
|
isEppUIEnabled: zod_1.z.boolean(),
|
|
34
|
+
isEppRecoveryCodesEnabled: zod_1.z.boolean(),
|
|
34
35
|
maskedUserEmail: zod_1.z.string(),
|
|
35
36
|
isUserU13: zod_1.z.boolean(),
|
|
36
37
|
isDelayedUiEnabled: zod_1.z.boolean(),
|
|
38
|
+
is2svRecoveryEnabled: zod_1.z.boolean(),
|
|
37
39
|
});
|
|
38
40
|
const Roblox_TwoStepVerification_Api_UserConfigurationMethod = zod_1.z.object({
|
|
39
41
|
mediaType: zod_1.z.enum([
|
package/lib/index.js
CHANGED
|
@@ -67,7 +67,7 @@ function prepareRequestUrl(endpoint, extendedParams) {
|
|
|
67
67
|
const pathParamPattern = new RegExp(`:${key}`);
|
|
68
68
|
// Check if this is a path parameter
|
|
69
69
|
if (pathParamPattern.test(processedPath)) {
|
|
70
|
-
processedPath = processedPath.replace(pathParamPattern, String(value));
|
|
70
|
+
processedPath = processedPath.replace(pathParamPattern, encodeURIComponent(String(value)));
|
|
71
71
|
usedPathParams.add(key);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* @param body
|
|
9
9
|
* @param universeId The identifier of the experience in which you want to send your messages to. You can [copy your experience's Universe ID](/cloud/guides/usage-messaging.md#publishing-messages-to-live-servers) on **Creator Dashboard**.
|
|
10
10
|
* @param topic The topic that you want to publish your message to, with up to 80 characters.
|
|
11
|
+
* @see POST https://apis.roblox.com/cloud/v2/universes/{universe_id}:publishMessage
|
|
12
|
+
* @deprecated Prefer the v2 alternative(s) listed above.
|
|
11
13
|
*/
|
|
12
14
|
export declare const postUniversesUniverseIdTopicsTopic: import("../..").EndpointGeneric<{
|
|
13
15
|
universeId: number;
|
|
@@ -14,6 +14,8 @@ const PublishRequest = zod_1.z.object({ message: zod_1.z.string().nullable() });
|
|
|
14
14
|
* @param body
|
|
15
15
|
* @param universeId The identifier of the experience in which you want to send your messages to. You can [copy your experience's Universe ID](/cloud/guides/usage-messaging.md#publishing-messages-to-live-servers) on **Creator Dashboard**.
|
|
16
16
|
* @param topic The topic that you want to publish your message to, with up to 80 characters.
|
|
17
|
+
* @see POST https://apis.roblox.com/cloud/v2/universes/{universe_id}:publishMessage
|
|
18
|
+
* @deprecated Prefer the v2 alternative(s) listed above.
|
|
17
19
|
*/
|
|
18
20
|
exports.postUniversesUniverseIdTopicsTopic = (0, __1.endpoint)({
|
|
19
21
|
method: 'POST',
|
|
@@ -3313,11 +3313,6 @@ scopes it has or who created it.
|
|
|
3313
3313
|
* Their inventory can still be viewed with an OAuth2 token if the target
|
|
3314
3314
|
user authorizes an app requesting permissions for the
|
|
3315
3315
|
`user.inventory-item:read` scope.
|
|
3316
|
-
|
|
3317
|
-
Rate Limits:
|
|
3318
|
-
* API Keys - 100 requests/minute per API key owner (can be user or group).
|
|
3319
|
-
Rate limits are enforced across all of an owner's API keys.
|
|
3320
|
-
* OAuth2 Tokens - 20 requests/minute per OAuth2 access token
|
|
3321
3316
|
*
|
|
3322
3317
|
* **Scopes:** `user.inventory-item:read`
|
|
3323
3318
|
* **Engine:** Usable with HttpService
|
|
@@ -3883,11 +3883,6 @@ scopes it has or who created it.
|
|
|
3883
3883
|
* Their inventory can still be viewed with an OAuth2 token if the target
|
|
3884
3884
|
user authorizes an app requesting permissions for the
|
|
3885
3885
|
`user.inventory-item:read` scope.
|
|
3886
|
-
|
|
3887
|
-
Rate Limits:
|
|
3888
|
-
* API Keys - 100 requests/minute per API key owner (can be user or group).
|
|
3889
|
-
Rate limits are enforced across all of an owner's API keys.
|
|
3890
|
-
* OAuth2 Tokens - 20 requests/minute per OAuth2 access token
|
|
3891
3886
|
*
|
|
3892
3887
|
* **Scopes:** `user.inventory-item:read`
|
|
3893
3888
|
* **Engine:** Usable with HttpService
|