@unofficialbox/box-open-sdk 0.1.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/README.md +13 -0
- package/dist/cjs/auth.js +112 -0
- package/dist/cjs/buildinfo.js +10 -0
- package/dist/cjs/client.js +268 -0
- package/dist/cjs/errors.js +20 -0
- package/dist/cjs/index.js +43 -0
- package/dist/cjs/internal.js +37 -0
- package/dist/cjs/jwt.js +122 -0
- package/dist/cjs/managers/ai.js +106 -0
- package/dist/cjs/managers/ai_studio.js +131 -0
- package/dist/cjs/managers/app_item_associations.js +119 -0
- package/dist/cjs/managers/archives.js +110 -0
- package/dist/cjs/managers/authorization.js +149 -0
- package/dist/cjs/managers/automate_workflows.js +91 -0
- package/dist/cjs/managers/avatars.js +76 -0
- package/dist/cjs/managers/chunked_uploads.js +156 -0
- package/dist/cjs/managers/classifications.js +94 -0
- package/dist/cjs/managers/collaboration_allowlist_entries.js +104 -0
- package/dist/cjs/managers/collaboration_allowlist_exempt_targets.js +104 -0
- package/dist/cjs/managers/collections.js +124 -0
- package/dist/cjs/managers/comments.js +131 -0
- package/dist/cjs/managers/device_pinners.js +99 -0
- package/dist/cjs/managers/docgen.js +133 -0
- package/dist/cjs/managers/docgen_template.js +178 -0
- package/dist/cjs/managers/downloads.js +69 -0
- package/dist/cjs/managers/email_aliases.js +78 -0
- package/dist/cjs/managers/enterprise_configurations.js +58 -0
- package/dist/cjs/managers/events.js +82 -0
- package/dist/cjs/managers/external_users.js +58 -0
- package/dist/cjs/managers/file_classifications.js +97 -0
- package/dist/cjs/managers/file_metadata.js +115 -0
- package/dist/cjs/managers/file_requests.js +90 -0
- package/dist/cjs/managers/file_version_legal_holds.js +88 -0
- package/dist/cjs/managers/file_version_retentions.js +105 -0
- package/dist/cjs/managers/file_versions.js +140 -0
- package/dist/cjs/managers/file_watermarks.js +77 -0
- package/dist/cjs/managers/files.js +138 -0
- package/dist/cjs/managers/folder_classifications.js +97 -0
- package/dist/cjs/managers/folder_locks.js +73 -0
- package/dist/cjs/managers/folder_metadata.js +111 -0
- package/dist/cjs/managers/folder_watermarks.js +77 -0
- package/dist/cjs/managers/folders.js +191 -0
- package/dist/cjs/managers/groups.js +132 -0
- package/dist/cjs/managers/hub_collaborations.js +121 -0
- package/dist/cjs/managers/hub_document.js +113 -0
- package/dist/cjs/managers/hub_items.js +96 -0
- package/dist/cjs/managers/hubs.js +186 -0
- package/dist/cjs/managers/index.js +102 -0
- package/dist/cjs/managers/integration_mappings.js +178 -0
- package/dist/cjs/managers/invites.js +74 -0
- package/dist/cjs/managers/legal_hold_policies.js +121 -0
- package/dist/cjs/managers/legal_hold_policy_assignments.js +186 -0
- package/dist/cjs/managers/list_collaborations.js +185 -0
- package/dist/cjs/managers/memberships.js +160 -0
- package/dist/cjs/managers/metadata_cascade_policies.js +118 -0
- package/dist/cjs/managers/metadata_taxonomies.js +322 -0
- package/dist/cjs/managers/metadata_templates.js +196 -0
- package/dist/cjs/managers/notes.js +58 -0
- package/dist/cjs/managers/recent_items.js +80 -0
- package/dist/cjs/managers/retention_policies.js +131 -0
- package/dist/cjs/managers/retention_policy_assignments.js +182 -0
- package/dist/cjs/managers/search.js +130 -0
- package/dist/cjs/managers/session_termination.js +68 -0
- package/dist/cjs/managers/shared_links_app_items.js +55 -0
- package/dist/cjs/managers/shared_links_files.js +109 -0
- package/dist/cjs/managers/shared_links_folders.js +109 -0
- package/dist/cjs/managers/shared_links_web_links.js +109 -0
- package/dist/cjs/managers/shield_information_barrier_reports.js +98 -0
- package/dist/cjs/managers/shield_information_barrier_segment_members.js +105 -0
- package/dist/cjs/managers/shield_information_barrier_segment_restrictions.js +105 -0
- package/dist/cjs/managers/shield_information_barrier_segments.js +116 -0
- package/dist/cjs/managers/shield_information_barriers.js +108 -0
- package/dist/cjs/managers/shield_lists.js +97 -0
- package/dist/cjs/managers/sign_requests.js +123 -0
- package/dist/cjs/managers/sign_templates.js +87 -0
- package/dist/cjs/managers/skills.js +106 -0
- package/dist/cjs/managers/storage_policies.js +90 -0
- package/dist/cjs/managers/storage_policy_assignments.js +114 -0
- package/dist/cjs/managers/task_assignments.js +94 -0
- package/dist/cjs/managers/tasks.js +94 -0
- package/dist/cjs/managers/terms_of_service_user_statuses.js +81 -0
- package/dist/cjs/managers/terms_of_services.js +89 -0
- package/dist/cjs/managers/transfer.js +67 -0
- package/dist/cjs/managers/trashed_files.js +84 -0
- package/dist/cjs/managers/trashed_folders.js +84 -0
- package/dist/cjs/managers/trashed_items.js +94 -0
- package/dist/cjs/managers/trashed_web_links.js +84 -0
- package/dist/cjs/managers/uploads.js +98 -0
- package/dist/cjs/managers/user_collaborations.js +95 -0
- package/dist/cjs/managers/users.js +165 -0
- package/dist/cjs/managers/web_links.js +88 -0
- package/dist/cjs/managers/webhooks.js +115 -0
- package/dist/cjs/managers/workflows.js +92 -0
- package/dist/cjs/managers/zip_downloads.js +76 -0
- package/dist/cjs/models/index.js +38 -0
- package/dist/cjs/models/schemas.js +3 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/runtime.js +304 -0
- package/dist/cjs/tokens.js +121 -0
- package/dist/esm/auth.js +105 -0
- package/dist/esm/buildinfo.js +7 -0
- package/dist/esm/client.js +264 -0
- package/dist/esm/errors.js +16 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/internal.js +32 -0
- package/dist/esm/jwt.js +86 -0
- package/dist/esm/managers/ai.js +69 -0
- package/dist/esm/managers/ai_studio.js +94 -0
- package/dist/esm/managers/app_item_associations.js +82 -0
- package/dist/esm/managers/archives.js +73 -0
- package/dist/esm/managers/authorization.js +112 -0
- package/dist/esm/managers/automate_workflows.js +54 -0
- package/dist/esm/managers/avatars.js +39 -0
- package/dist/esm/managers/chunked_uploads.js +119 -0
- package/dist/esm/managers/classifications.js +57 -0
- package/dist/esm/managers/collaboration_allowlist_entries.js +67 -0
- package/dist/esm/managers/collaboration_allowlist_exempt_targets.js +67 -0
- package/dist/esm/managers/collections.js +87 -0
- package/dist/esm/managers/comments.js +94 -0
- package/dist/esm/managers/device_pinners.js +62 -0
- package/dist/esm/managers/docgen.js +96 -0
- package/dist/esm/managers/docgen_template.js +141 -0
- package/dist/esm/managers/downloads.js +32 -0
- package/dist/esm/managers/email_aliases.js +41 -0
- package/dist/esm/managers/enterprise_configurations.js +21 -0
- package/dist/esm/managers/events.js +45 -0
- package/dist/esm/managers/external_users.js +21 -0
- package/dist/esm/managers/file_classifications.js +60 -0
- package/dist/esm/managers/file_metadata.js +78 -0
- package/dist/esm/managers/file_requests.js +53 -0
- package/dist/esm/managers/file_version_legal_holds.js +51 -0
- package/dist/esm/managers/file_version_retentions.js +68 -0
- package/dist/esm/managers/file_versions.js +103 -0
- package/dist/esm/managers/file_watermarks.js +40 -0
- package/dist/esm/managers/files.js +101 -0
- package/dist/esm/managers/folder_classifications.js +60 -0
- package/dist/esm/managers/folder_locks.js +36 -0
- package/dist/esm/managers/folder_metadata.js +74 -0
- package/dist/esm/managers/folder_watermarks.js +40 -0
- package/dist/esm/managers/folders.js +154 -0
- package/dist/esm/managers/groups.js +95 -0
- package/dist/esm/managers/hub_collaborations.js +84 -0
- package/dist/esm/managers/hub_document.js +76 -0
- package/dist/esm/managers/hub_items.js +59 -0
- package/dist/esm/managers/hubs.js +149 -0
- package/dist/esm/managers/index.js +86 -0
- package/dist/esm/managers/integration_mappings.js +141 -0
- package/dist/esm/managers/invites.js +37 -0
- package/dist/esm/managers/legal_hold_policies.js +84 -0
- package/dist/esm/managers/legal_hold_policy_assignments.js +149 -0
- package/dist/esm/managers/list_collaborations.js +148 -0
- package/dist/esm/managers/memberships.js +123 -0
- package/dist/esm/managers/metadata_cascade_policies.js +81 -0
- package/dist/esm/managers/metadata_taxonomies.js +285 -0
- package/dist/esm/managers/metadata_templates.js +159 -0
- package/dist/esm/managers/notes.js +21 -0
- package/dist/esm/managers/recent_items.js +43 -0
- package/dist/esm/managers/retention_policies.js +94 -0
- package/dist/esm/managers/retention_policy_assignments.js +145 -0
- package/dist/esm/managers/search.js +93 -0
- package/dist/esm/managers/session_termination.js +31 -0
- package/dist/esm/managers/shared_links_app_items.js +18 -0
- package/dist/esm/managers/shared_links_files.js +72 -0
- package/dist/esm/managers/shared_links_folders.js +72 -0
- package/dist/esm/managers/shared_links_web_links.js +72 -0
- package/dist/esm/managers/shield_information_barrier_reports.js +61 -0
- package/dist/esm/managers/shield_information_barrier_segment_members.js +68 -0
- package/dist/esm/managers/shield_information_barrier_segment_restrictions.js +68 -0
- package/dist/esm/managers/shield_information_barrier_segments.js +79 -0
- package/dist/esm/managers/shield_information_barriers.js +71 -0
- package/dist/esm/managers/shield_lists.js +60 -0
- package/dist/esm/managers/sign_requests.js +86 -0
- package/dist/esm/managers/sign_templates.js +50 -0
- package/dist/esm/managers/skills.js +69 -0
- package/dist/esm/managers/storage_policies.js +53 -0
- package/dist/esm/managers/storage_policy_assignments.js +77 -0
- package/dist/esm/managers/task_assignments.js +57 -0
- package/dist/esm/managers/tasks.js +57 -0
- package/dist/esm/managers/terms_of_service_user_statuses.js +44 -0
- package/dist/esm/managers/terms_of_services.js +52 -0
- package/dist/esm/managers/transfer.js +30 -0
- package/dist/esm/managers/trashed_files.js +47 -0
- package/dist/esm/managers/trashed_folders.js +47 -0
- package/dist/esm/managers/trashed_items.js +57 -0
- package/dist/esm/managers/trashed_web_links.js +47 -0
- package/dist/esm/managers/uploads.js +61 -0
- package/dist/esm/managers/user_collaborations.js +58 -0
- package/dist/esm/managers/users.js +128 -0
- package/dist/esm/managers/web_links.js +51 -0
- package/dist/esm/managers/webhooks.js +78 -0
- package/dist/esm/managers/workflows.js +55 -0
- package/dist/esm/managers/zip_downloads.js +39 -0
- package/dist/esm/models/index.js +2 -0
- package/dist/esm/models/schemas.js +2 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/runtime.js +272 -0
- package/dist/esm/tokens.js +116 -0
- package/dist/types/auth.d.ts +56 -0
- package/dist/types/buildinfo.d.ts +6 -0
- package/dist/types/client.d.ts +176 -0
- package/dist/types/errors.d.ts +19 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/internal.d.ts +9 -0
- package/dist/types/jwt.d.ts +23 -0
- package/dist/types/managers/ai.d.ts +17 -0
- package/dist/types/managers/ai_studio.d.ts +27 -0
- package/dist/types/managers/app_item_associations.d.ts +25 -0
- package/dist/types/managers/archives.d.ts +18 -0
- package/dist/types/managers/authorization.d.ts +17 -0
- package/dist/types/managers/automate_workflows.d.ts +16 -0
- package/dist/types/managers/avatars.d.ts +10 -0
- package/dist/types/managers/chunked_uploads.d.ts +26 -0
- package/dist/types/managers/classifications.d.ts +11 -0
- package/dist/types/managers/collaboration_allowlist_entries.d.ts +18 -0
- package/dist/types/managers/collaboration_allowlist_exempt_targets.d.ts +18 -0
- package/dist/types/managers/collections.d.ts +26 -0
- package/dist/types/managers/comments.d.ts +32 -0
- package/dist/types/managers/device_pinners.d.ts +18 -0
- package/dist/types/managers/docgen.d.ts +25 -0
- package/dist/types/managers/docgen_template.d.ts +35 -0
- package/dist/types/managers/downloads.d.ts +14 -0
- package/dist/types/managers/email_aliases.d.ts +10 -0
- package/dist/types/managers/enterprise_configurations.d.ts +8 -0
- package/dist/types/managers/events.d.ts +18 -0
- package/dist/types/managers/external_users.d.ts +8 -0
- package/dist/types/managers/file_classifications.d.ts +11 -0
- package/dist/types/managers/file_metadata.d.ts +20 -0
- package/dist/types/managers/file_requests.d.ts +15 -0
- package/dist/types/managers/file_version_legal_holds.d.ts +16 -0
- package/dist/types/managers/file_version_retentions.d.ts +22 -0
- package/dist/types/managers/file_versions.d.ts +32 -0
- package/dist/types/managers/file_watermarks.d.ts +10 -0
- package/dist/types/managers/files.d.ts +39 -0
- package/dist/types/managers/folder_classifications.d.ts +11 -0
- package/dist/types/managers/folder_locks.d.ts +10 -0
- package/dist/types/managers/folder_metadata.d.ts +16 -0
- package/dist/types/managers/folder_watermarks.d.ts +10 -0
- package/dist/types/managers/folders.d.ts +54 -0
- package/dist/types/managers/groups.d.ts +33 -0
- package/dist/types/managers/hub_collaborations.d.ts +19 -0
- package/dist/types/managers/hub_document.d.ts +23 -0
- package/dist/types/managers/hub_items.d.ts +17 -0
- package/dist/types/managers/hubs.d.ts +35 -0
- package/dist/types/managers/index.d.ts +85 -0
- package/dist/types/managers/integration_mappings.d.ts +34 -0
- package/dist/types/managers/invites.d.ts +17 -0
- package/dist/types/managers/legal_hold_policies.d.ts +21 -0
- package/dist/types/managers/legal_hold_policy_assignments.d.ts +39 -0
- package/dist/types/managers/list_collaborations.d.ts +42 -0
- package/dist/types/managers/memberships.d.ts +39 -0
- package/dist/types/managers/metadata_cascade_policies.d.ts +20 -0
- package/dist/types/managers/metadata_taxonomies.d.ts +54 -0
- package/dist/types/managers/metadata_templates.d.ts +36 -0
- package/dist/types/managers/notes.d.ts +8 -0
- package/dist/types/managers/recent_items.d.ts +16 -0
- package/dist/types/managers/retention_policies.d.ts +27 -0
- package/dist/types/managers/retention_policy_assignments.d.ts +40 -0
- package/dist/types/managers/search.d.ts +33 -0
- package/dist/types/managers/session_termination.d.ts +9 -0
- package/dist/types/managers/shared_links_app_items.d.ts +8 -0
- package/dist/types/managers/shared_links_files.d.ts +17 -0
- package/dist/types/managers/shared_links_folders.d.ts +17 -0
- package/dist/types/managers/shared_links_web_links.d.ts +17 -0
- package/dist/types/managers/shield_information_barrier_reports.d.ts +17 -0
- package/dist/types/managers/shield_information_barrier_segment_members.d.ts +18 -0
- package/dist/types/managers/shield_information_barrier_segment_restrictions.d.ts +18 -0
- package/dist/types/managers/shield_information_barrier_segments.d.ts +19 -0
- package/dist/types/managers/shield_information_barriers.d.ts +18 -0
- package/dist/types/managers/shield_lists.d.ts +12 -0
- package/dist/types/managers/sign_requests.d.ts +21 -0
- package/dist/types/managers/sign_templates.d.ts +16 -0
- package/dist/types/managers/skills.d.ts +12 -0
- package/dist/types/managers/storage_policies.d.ts +17 -0
- package/dist/types/managers/storage_policy_assignments.d.ts +18 -0
- package/dist/types/managers/task_assignments.d.ts +12 -0
- package/dist/types/managers/tasks.d.ts +12 -0
- package/dist/types/managers/terms_of_service_user_statuses.d.ts +14 -0
- package/dist/types/managers/terms_of_services.d.ts +15 -0
- package/dist/types/managers/transfer.d.ts +13 -0
- package/dist/types/managers/trashed_files.d.ts +18 -0
- package/dist/types/managers/trashed_folders.d.ts +18 -0
- package/dist/types/managers/trashed_items.d.ts +20 -0
- package/dist/types/managers/trashed_web_links.d.ts +18 -0
- package/dist/types/managers/uploads.d.ts +21 -0
- package/dist/types/managers/user_collaborations.d.ts +20 -0
- package/dist/types/managers/users.d.ts +47 -0
- package/dist/types/managers/web_links.d.ts +15 -0
- package/dist/types/managers/webhooks.d.ts +19 -0
- package/dist/types/managers/workflows.d.ts +17 -0
- package/dist/types/managers/zip_downloads.d.ts +10 -0
- package/dist/types/models/index.d.ts +1 -0
- package/dist/types/models/schemas.d.ts +4424 -0
- package/dist/types/runtime.d.ts +85 -0
- package/dist/types/tokens.d.ts +50 -0
- package/docs/README.md +101 -0
- package/docs/auth.md +60 -0
- package/docs/errors.md +20 -0
- package/docs/managers/ai.md +49 -0
- package/docs/managers/ai_studio.md +63 -0
- package/docs/managers/app_item_associations.md +35 -0
- package/docs/managers/archives.md +48 -0
- package/docs/managers/authorization.md +43 -0
- package/docs/managers/automate_workflows.md +31 -0
- package/docs/managers/avatars.md +37 -0
- package/docs/managers/chunked_uploads.md +88 -0
- package/docs/managers/classifications.md +35 -0
- package/docs/managers/collaboration_allowlist_entries.md +46 -0
- package/docs/managers/collaboration_allowlist_exempt_targets.md +46 -0
- package/docs/managers/collections.md +44 -0
- package/docs/managers/comments.md +66 -0
- package/docs/managers/device_pinners.md +40 -0
- package/docs/managers/docgen.md +50 -0
- package/docs/managers/docgen_template.md +75 -0
- package/docs/managers/downloads.md +19 -0
- package/docs/managers/email_aliases.md +38 -0
- package/docs/managers/enterprise_configurations.md +16 -0
- package/docs/managers/events.md +26 -0
- package/docs/managers/external_users.md +13 -0
- package/docs/managers/file_classifications.md +49 -0
- package/docs/managers/file_metadata.md +69 -0
- package/docs/managers/file_requests.md +50 -0
- package/docs/managers/file_version_legal_holds.md +29 -0
- package/docs/managers/file_version_retentions.md +34 -0
- package/docs/managers/file_versions.md +70 -0
- package/docs/managers/file_watermarks.md +37 -0
- package/docs/managers/files.md +72 -0
- package/docs/managers/folder_classifications.md +49 -0
- package/docs/managers/folder_locks.md +33 -0
- package/docs/managers/folder_metadata.md +68 -0
- package/docs/managers/folder_watermarks.md +37 -0
- package/docs/managers/folders.md +93 -0
- package/docs/managers/groups.md +66 -0
- package/docs/managers/hub_collaborations.md +59 -0
- package/docs/managers/hub_document.md +34 -0
- package/docs/managers/hub_items.md +32 -0
- package/docs/managers/hubs.md +90 -0
- package/docs/managers/integration_mappings.md +96 -0
- package/docs/managers/invites.md +28 -0
- package/docs/managers/legal_hold_policies.md +60 -0
- package/docs/managers/legal_hold_policy_assignments.md +80 -0
- package/docs/managers/list_collaborations.md +64 -0
- package/docs/managers/memberships.md +79 -0
- package/docs/managers/metadata_cascade_policies.md +60 -0
- package/docs/managers/metadata_taxonomies.md +206 -0
- package/docs/managers/metadata_templates.md +98 -0
- package/docs/managers/notes.md +13 -0
- package/docs/managers/recent_items.md +19 -0
- package/docs/managers/retention_policies.md +63 -0
- package/docs/managers/retention_policy_assignments.md +78 -0
- package/docs/managers/search.md +43 -0
- package/docs/managers/session_termination.md +21 -0
- package/docs/managers/shared_links_app_items.md +15 -0
- package/docs/managers/shared_links_files.md +67 -0
- package/docs/managers/shared_links_folders.md +67 -0
- package/docs/managers/shared_links_web_links.md +67 -0
- package/docs/managers/shield_information_barrier_reports.md +37 -0
- package/docs/managers/shield_information_barrier_segment_members.md +47 -0
- package/docs/managers/shield_information_barrier_segment_restrictions.md +47 -0
- package/docs/managers/shield_information_barrier_segments.md +59 -0
- package/docs/managers/shield_information_barriers.md +44 -0
- package/docs/managers/shield_lists.md +51 -0
- package/docs/managers/sign_requests.md +60 -0
- package/docs/managers/sign_templates.md +28 -0
- package/docs/managers/skills.md +61 -0
- package/docs/managers/storage_policies.md +29 -0
- package/docs/managers/storage_policy_assignments.md +59 -0
- package/docs/managers/task_assignments.md +55 -0
- package/docs/managers/tasks.md +55 -0
- package/docs/managers/terms_of_service_user_statuses.md +36 -0
- package/docs/managers/terms_of_services.md +45 -0
- package/docs/managers/transfer.md +19 -0
- package/docs/managers/trashed_files.md +39 -0
- package/docs/managers/trashed_folders.md +39 -0
- package/docs/managers/trashed_items.md +23 -0
- package/docs/managers/trashed_web_links.md +39 -0
- package/docs/managers/uploads.md +41 -0
- package/docs/managers/user_collaborations.md +51 -0
- package/docs/managers/users.md +82 -0
- package/docs/managers/web_links.md +46 -0
- package/docs/managers/webhooks.md +58 -0
- package/docs/managers/workflows.md +32 -0
- package/docs/managers/zip_downloads.md +33 -0
- package/docs/pagination.md +17 -0
- package/package.json +32 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Code generated by box-gantry. DO NOT EDIT.
|
|
2
|
+
import * as runtime from '../runtime.js';
|
|
3
|
+
import { pathEscape } from '../internal.js';
|
|
4
|
+
/** Operations for the "users" API area. */
|
|
5
|
+
export class UsersManager {
|
|
6
|
+
session;
|
|
7
|
+
constructor(session) {
|
|
8
|
+
this.session = session;
|
|
9
|
+
}
|
|
10
|
+
/** Iterate every `models.schemas.UserFull` across pages, threading the marker cursor. */
|
|
11
|
+
async *list(opts) {
|
|
12
|
+
const options = { ...opts };
|
|
13
|
+
for (;;) {
|
|
14
|
+
const page = await this.listPage(options);
|
|
15
|
+
const items = page.entries ?? [];
|
|
16
|
+
for (const item of items) {
|
|
17
|
+
yield item;
|
|
18
|
+
}
|
|
19
|
+
const cursor = page.next_marker;
|
|
20
|
+
if (cursor === undefined || cursor === null || cursor === '') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
options.marker = cursor;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async listPage(opts) {
|
|
27
|
+
let url = this.session.baseUrl("api");
|
|
28
|
+
url += "/users";
|
|
29
|
+
let req = this.session.newRequest("GET", url);
|
|
30
|
+
const options = opts ?? {};
|
|
31
|
+
if (options.filter_term !== undefined) {
|
|
32
|
+
req = runtime.withQuery(req, "filter_term", options.filter_term);
|
|
33
|
+
}
|
|
34
|
+
if (options.user_type !== undefined) {
|
|
35
|
+
req = runtime.withQuery(req, "user_type", options.user_type);
|
|
36
|
+
}
|
|
37
|
+
if (options.external_app_user_id !== undefined) {
|
|
38
|
+
req = runtime.withQuery(req, "external_app_user_id", options.external_app_user_id);
|
|
39
|
+
}
|
|
40
|
+
if (options.fields !== undefined) {
|
|
41
|
+
req = runtime.withQuery(req, "fields", options.fields.join(','));
|
|
42
|
+
}
|
|
43
|
+
if (options.offset !== undefined) {
|
|
44
|
+
req = runtime.withQuery(req, "offset", String(options.offset));
|
|
45
|
+
}
|
|
46
|
+
if (options.limit !== undefined) {
|
|
47
|
+
req = runtime.withQuery(req, "limit", String(options.limit));
|
|
48
|
+
}
|
|
49
|
+
if (options.usemarker !== undefined) {
|
|
50
|
+
req = runtime.withQuery(req, "usemarker", String(options.usemarker));
|
|
51
|
+
}
|
|
52
|
+
if (options.marker !== undefined) {
|
|
53
|
+
req = runtime.withQuery(req, "marker", options.marker);
|
|
54
|
+
}
|
|
55
|
+
const resp = await this.session.fetch(req);
|
|
56
|
+
const data = runtime.responseBytes(resp);
|
|
57
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
58
|
+
}
|
|
59
|
+
async create(body, opts) {
|
|
60
|
+
let url = this.session.baseUrl("api");
|
|
61
|
+
url += "/users";
|
|
62
|
+
let req = this.session.newRequest("POST", url);
|
|
63
|
+
const options = opts ?? {};
|
|
64
|
+
if (options.fields !== undefined) {
|
|
65
|
+
req = runtime.withQuery(req, "fields", options.fields.join(','));
|
|
66
|
+
}
|
|
67
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
68
|
+
req = runtime.withJsonBody(req, payload);
|
|
69
|
+
const resp = await this.session.fetch(req);
|
|
70
|
+
const data = runtime.responseBytes(resp);
|
|
71
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
72
|
+
}
|
|
73
|
+
async getMe(opts) {
|
|
74
|
+
let url = this.session.baseUrl("api");
|
|
75
|
+
url += "/users";
|
|
76
|
+
url += "/me";
|
|
77
|
+
let req = this.session.newRequest("GET", url);
|
|
78
|
+
const options = opts ?? {};
|
|
79
|
+
if (options.fields !== undefined) {
|
|
80
|
+
req = runtime.withQuery(req, "fields", options.fields.join(','));
|
|
81
|
+
}
|
|
82
|
+
const resp = await this.session.fetch(req);
|
|
83
|
+
const data = runtime.responseBytes(resp);
|
|
84
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
85
|
+
}
|
|
86
|
+
async get(userId, opts) {
|
|
87
|
+
let url = this.session.baseUrl("api");
|
|
88
|
+
url += "/users";
|
|
89
|
+
url += '/' + pathEscape(userId);
|
|
90
|
+
let req = this.session.newRequest("GET", url);
|
|
91
|
+
const options = opts ?? {};
|
|
92
|
+
if (options.fields !== undefined) {
|
|
93
|
+
req = runtime.withQuery(req, "fields", options.fields.join(','));
|
|
94
|
+
}
|
|
95
|
+
const resp = await this.session.fetch(req);
|
|
96
|
+
const data = runtime.responseBytes(resp);
|
|
97
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
98
|
+
}
|
|
99
|
+
async update(userId, body, opts) {
|
|
100
|
+
let url = this.session.baseUrl("api");
|
|
101
|
+
url += "/users";
|
|
102
|
+
url += '/' + pathEscape(userId);
|
|
103
|
+
let req = this.session.newRequest("PUT", url);
|
|
104
|
+
const options = opts ?? {};
|
|
105
|
+
if (options.fields !== undefined) {
|
|
106
|
+
req = runtime.withQuery(req, "fields", options.fields.join(','));
|
|
107
|
+
}
|
|
108
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
109
|
+
req = runtime.withJsonBody(req, payload);
|
|
110
|
+
const resp = await this.session.fetch(req);
|
|
111
|
+
const data = runtime.responseBytes(resp);
|
|
112
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
113
|
+
}
|
|
114
|
+
async delete_(userId, opts) {
|
|
115
|
+
let url = this.session.baseUrl("api");
|
|
116
|
+
url += "/users";
|
|
117
|
+
url += '/' + pathEscape(userId);
|
|
118
|
+
let req = this.session.newRequest("DELETE", url);
|
|
119
|
+
const options = opts ?? {};
|
|
120
|
+
if (options.notify !== undefined) {
|
|
121
|
+
req = runtime.withQuery(req, "notify", String(options.notify));
|
|
122
|
+
}
|
|
123
|
+
if (options.force !== undefined) {
|
|
124
|
+
req = runtime.withQuery(req, "force", String(options.force));
|
|
125
|
+
}
|
|
126
|
+
await this.session.fetch(req);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Code generated by box-gantry. DO NOT EDIT.
|
|
2
|
+
import * as runtime from '../runtime.js';
|
|
3
|
+
import { pathEscape } from '../internal.js';
|
|
4
|
+
/** Operations for the "web_links" API area. */
|
|
5
|
+
export class WebLinksManager {
|
|
6
|
+
session;
|
|
7
|
+
constructor(session) {
|
|
8
|
+
this.session = session;
|
|
9
|
+
}
|
|
10
|
+
async create(body) {
|
|
11
|
+
let url = this.session.baseUrl("api");
|
|
12
|
+
url += "/web_links";
|
|
13
|
+
let req = this.session.newRequest("POST", url);
|
|
14
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
15
|
+
req = runtime.withJsonBody(req, payload);
|
|
16
|
+
const resp = await this.session.fetch(req);
|
|
17
|
+
const data = runtime.responseBytes(resp);
|
|
18
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
19
|
+
}
|
|
20
|
+
async get(webLinkId, opts) {
|
|
21
|
+
let url = this.session.baseUrl("api");
|
|
22
|
+
url += "/web_links";
|
|
23
|
+
url += '/' + pathEscape(webLinkId);
|
|
24
|
+
let req = this.session.newRequest("GET", url);
|
|
25
|
+
const options = opts ?? {};
|
|
26
|
+
if (options.boxapi !== undefined) {
|
|
27
|
+
req = runtime.withHeader(req, "boxapi", options.boxapi);
|
|
28
|
+
}
|
|
29
|
+
const resp = await this.session.fetch(req);
|
|
30
|
+
const data = runtime.responseBytes(resp);
|
|
31
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
32
|
+
}
|
|
33
|
+
async update(webLinkId, body) {
|
|
34
|
+
let url = this.session.baseUrl("api");
|
|
35
|
+
url += "/web_links";
|
|
36
|
+
url += '/' + pathEscape(webLinkId);
|
|
37
|
+
let req = this.session.newRequest("PUT", url);
|
|
38
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
39
|
+
req = runtime.withJsonBody(req, payload);
|
|
40
|
+
const resp = await this.session.fetch(req);
|
|
41
|
+
const data = runtime.responseBytes(resp);
|
|
42
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
43
|
+
}
|
|
44
|
+
async delete_(webLinkId) {
|
|
45
|
+
let url = this.session.baseUrl("api");
|
|
46
|
+
url += "/web_links";
|
|
47
|
+
url += '/' + pathEscape(webLinkId);
|
|
48
|
+
let req = this.session.newRequest("DELETE", url);
|
|
49
|
+
await this.session.fetch(req);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Code generated by box-gantry. DO NOT EDIT.
|
|
2
|
+
import * as runtime from '../runtime.js';
|
|
3
|
+
import { pathEscape } from '../internal.js';
|
|
4
|
+
/** Operations for the "webhooks" API area. */
|
|
5
|
+
export class WebhooksManager {
|
|
6
|
+
session;
|
|
7
|
+
constructor(session) {
|
|
8
|
+
this.session = session;
|
|
9
|
+
}
|
|
10
|
+
/** Iterate every `models.schemas.WebhookMini` across pages, threading the marker cursor. */
|
|
11
|
+
async *list(opts) {
|
|
12
|
+
const options = { ...opts };
|
|
13
|
+
for (;;) {
|
|
14
|
+
const page = await this.listPage(options);
|
|
15
|
+
const items = page.entries ?? [];
|
|
16
|
+
for (const item of items) {
|
|
17
|
+
yield item;
|
|
18
|
+
}
|
|
19
|
+
const cursor = page.next_marker;
|
|
20
|
+
if (cursor === undefined || cursor === null || cursor === '') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
options.marker = cursor;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async listPage(opts) {
|
|
27
|
+
let url = this.session.baseUrl("api");
|
|
28
|
+
url += "/webhooks";
|
|
29
|
+
let req = this.session.newRequest("GET", url);
|
|
30
|
+
const options = opts ?? {};
|
|
31
|
+
if (options.marker !== undefined) {
|
|
32
|
+
req = runtime.withQuery(req, "marker", options.marker);
|
|
33
|
+
}
|
|
34
|
+
if (options.limit !== undefined) {
|
|
35
|
+
req = runtime.withQuery(req, "limit", String(options.limit));
|
|
36
|
+
}
|
|
37
|
+
const resp = await this.session.fetch(req);
|
|
38
|
+
const data = runtime.responseBytes(resp);
|
|
39
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
40
|
+
}
|
|
41
|
+
async create(body) {
|
|
42
|
+
let url = this.session.baseUrl("api");
|
|
43
|
+
url += "/webhooks";
|
|
44
|
+
let req = this.session.newRequest("POST", url);
|
|
45
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
46
|
+
req = runtime.withJsonBody(req, payload);
|
|
47
|
+
const resp = await this.session.fetch(req);
|
|
48
|
+
const data = runtime.responseBytes(resp);
|
|
49
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
50
|
+
}
|
|
51
|
+
async get(webhookId) {
|
|
52
|
+
let url = this.session.baseUrl("api");
|
|
53
|
+
url += "/webhooks";
|
|
54
|
+
url += '/' + pathEscape(webhookId);
|
|
55
|
+
let req = this.session.newRequest("GET", url);
|
|
56
|
+
const resp = await this.session.fetch(req);
|
|
57
|
+
const data = runtime.responseBytes(resp);
|
|
58
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
59
|
+
}
|
|
60
|
+
async update(webhookId, body) {
|
|
61
|
+
let url = this.session.baseUrl("api");
|
|
62
|
+
url += "/webhooks";
|
|
63
|
+
url += '/' + pathEscape(webhookId);
|
|
64
|
+
let req = this.session.newRequest("PUT", url);
|
|
65
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
66
|
+
req = runtime.withJsonBody(req, payload);
|
|
67
|
+
const resp = await this.session.fetch(req);
|
|
68
|
+
const data = runtime.responseBytes(resp);
|
|
69
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
70
|
+
}
|
|
71
|
+
async delete_(webhookId) {
|
|
72
|
+
let url = this.session.baseUrl("api");
|
|
73
|
+
url += "/webhooks";
|
|
74
|
+
url += '/' + pathEscape(webhookId);
|
|
75
|
+
let req = this.session.newRequest("DELETE", url);
|
|
76
|
+
await this.session.fetch(req);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Code generated by box-gantry. DO NOT EDIT.
|
|
2
|
+
import * as runtime from '../runtime.js';
|
|
3
|
+
import { pathEscape } from '../internal.js';
|
|
4
|
+
/** Operations for the "workflows" API area. */
|
|
5
|
+
export class WorkflowsManager {
|
|
6
|
+
session;
|
|
7
|
+
constructor(session) {
|
|
8
|
+
this.session = session;
|
|
9
|
+
}
|
|
10
|
+
/** Iterate every `models.schemas.Workflow` across pages, threading the marker cursor. */
|
|
11
|
+
async *list(folderId, opts) {
|
|
12
|
+
const options = { ...opts };
|
|
13
|
+
for (;;) {
|
|
14
|
+
const page = await this.listPage(folderId, options);
|
|
15
|
+
const items = page.entries ?? [];
|
|
16
|
+
for (const item of items) {
|
|
17
|
+
yield item;
|
|
18
|
+
}
|
|
19
|
+
const cursor = page.next_marker;
|
|
20
|
+
if (cursor === undefined || cursor === null || cursor === '') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
options.marker = cursor;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async listPage(folderId, opts) {
|
|
27
|
+
let url = this.session.baseUrl("api");
|
|
28
|
+
url += "/workflows";
|
|
29
|
+
let req = this.session.newRequest("GET", url);
|
|
30
|
+
req = runtime.withQuery(req, "folder_id", folderId);
|
|
31
|
+
const options = opts ?? {};
|
|
32
|
+
if (options.trigger_type !== undefined) {
|
|
33
|
+
req = runtime.withQuery(req, "trigger_type", options.trigger_type);
|
|
34
|
+
}
|
|
35
|
+
if (options.limit !== undefined) {
|
|
36
|
+
req = runtime.withQuery(req, "limit", String(options.limit));
|
|
37
|
+
}
|
|
38
|
+
if (options.marker !== undefined) {
|
|
39
|
+
req = runtime.withQuery(req, "marker", options.marker);
|
|
40
|
+
}
|
|
41
|
+
const resp = await this.session.fetch(req);
|
|
42
|
+
const data = runtime.responseBytes(resp);
|
|
43
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
44
|
+
}
|
|
45
|
+
async start(workflowId, body) {
|
|
46
|
+
let url = this.session.baseUrl("api");
|
|
47
|
+
url += "/workflows";
|
|
48
|
+
url += '/' + pathEscape(workflowId);
|
|
49
|
+
url += "/start";
|
|
50
|
+
let req = this.session.newRequest("POST", url);
|
|
51
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
52
|
+
req = runtime.withJsonBody(req, payload);
|
|
53
|
+
await this.session.fetch(req);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Code generated by box-gantry. DO NOT EDIT.
|
|
2
|
+
import * as runtime from '../runtime.js';
|
|
3
|
+
import { pathEscape } from '../internal.js';
|
|
4
|
+
/** Operations for the "zip_downloads" API area. */
|
|
5
|
+
export class ZipDownloadsManager {
|
|
6
|
+
session;
|
|
7
|
+
constructor(session) {
|
|
8
|
+
this.session = session;
|
|
9
|
+
}
|
|
10
|
+
async create(body) {
|
|
11
|
+
let url = this.session.baseUrl("api");
|
|
12
|
+
url += "/zip_downloads";
|
|
13
|
+
let req = this.session.newRequest("POST", url);
|
|
14
|
+
const payload = new TextEncoder().encode(JSON.stringify(body));
|
|
15
|
+
req = runtime.withJsonBody(req, payload);
|
|
16
|
+
const resp = await this.session.fetch(req);
|
|
17
|
+
const data = runtime.responseBytes(resp);
|
|
18
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
19
|
+
}
|
|
20
|
+
async getContent(zipDownloadId) {
|
|
21
|
+
let url = this.session.baseUrl("download");
|
|
22
|
+
url += "/zip_downloads";
|
|
23
|
+
url += '/' + pathEscape(zipDownloadId);
|
|
24
|
+
url += "/content";
|
|
25
|
+
let req = this.session.newRequest("GET", url);
|
|
26
|
+
const resp = await this.session.fetch(req);
|
|
27
|
+
return runtime.responseStream(resp);
|
|
28
|
+
}
|
|
29
|
+
async getStatus(zipDownloadId) {
|
|
30
|
+
let url = this.session.baseUrl("api");
|
|
31
|
+
url += "/zip_downloads";
|
|
32
|
+
url += '/' + pathEscape(zipDownloadId);
|
|
33
|
+
url += "/status";
|
|
34
|
+
let req = this.session.newRequest("GET", url);
|
|
35
|
+
const resp = await this.session.fetch(req);
|
|
36
|
+
const data = runtime.responseBytes(resp);
|
|
37
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// Code generated by box-gantry (vendored from runtimes/typescript/gantryruntime/src/runtime.ts). DO NOT EDIT.
|
|
2
|
+
import { BoxApiError } from './errors.js';
|
|
3
|
+
export { BoxApiError } from './errors.js';
|
|
4
|
+
export * from './auth.js';
|
|
5
|
+
/** The default base URLs for the D-106 URL classes. */
|
|
6
|
+
const DEFAULT_BASE_URLS = {
|
|
7
|
+
api: 'https://api.box.com/2.0',
|
|
8
|
+
api_root: 'https://api.box.com',
|
|
9
|
+
upload: 'https://upload.box.com/api/2.0',
|
|
10
|
+
upload_session: 'https://upload.box.com/api/2.0',
|
|
11
|
+
oauth_authorize: 'https://account.box.com/api/oauth2',
|
|
12
|
+
download: 'https://api.box.com/2.0',
|
|
13
|
+
};
|
|
14
|
+
/** The runtime-owned HTTP request envelope, assembled by the `with*` builders
|
|
15
|
+
* before `fetch` executes it. */
|
|
16
|
+
export class Request {
|
|
17
|
+
method;
|
|
18
|
+
url;
|
|
19
|
+
headers = new Headers();
|
|
20
|
+
query = new URLSearchParams();
|
|
21
|
+
/** The buffered request body, if any (buffered so retries can replay it). */
|
|
22
|
+
body;
|
|
23
|
+
constructor(method, url) {
|
|
24
|
+
this.method = method;
|
|
25
|
+
this.url = url;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** The runtime-owned HTTP response envelope. The body is read fully so it can be
|
|
29
|
+
* replayed as bytes or a stream, and so retries stay safe. */
|
|
30
|
+
export class Response {
|
|
31
|
+
status;
|
|
32
|
+
headers;
|
|
33
|
+
bodyBytes;
|
|
34
|
+
constructor(status, headers, bodyBytes) {
|
|
35
|
+
this.status = status;
|
|
36
|
+
this.headers = headers;
|
|
37
|
+
this.bodyBytes = bodyBytes;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** A response/request body as bytes. The platform buffers it (the manifest's
|
|
41
|
+
* `Streaming` axis allows buffering) so a retried request can replay it. */
|
|
42
|
+
export class Stream {
|
|
43
|
+
data;
|
|
44
|
+
constructor(data) {
|
|
45
|
+
this.data = data;
|
|
46
|
+
}
|
|
47
|
+
/** An empty stream (e.g. an absent multipart file part). */
|
|
48
|
+
static empty() {
|
|
49
|
+
return new Stream(new Uint8Array(0));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** The runtime session: it holds the auth flow, base-URL configuration, and
|
|
53
|
+
* retry policy shared by every manager. */
|
|
54
|
+
export class Client {
|
|
55
|
+
auth;
|
|
56
|
+
baseUrls;
|
|
57
|
+
maxRetries;
|
|
58
|
+
constructor(auth, options = {}) {
|
|
59
|
+
this.auth = auth;
|
|
60
|
+
const maxRetries = options.maxRetries ?? 5;
|
|
61
|
+
if (!Number.isInteger(maxRetries) || maxRetries < 0) {
|
|
62
|
+
throw new RangeError('maxRetries must be a non-negative integer');
|
|
63
|
+
}
|
|
64
|
+
this.maxRetries = maxRetries;
|
|
65
|
+
this.baseUrls = { ...DEFAULT_BASE_URLS, ...(options.baseUrls ?? {}) };
|
|
66
|
+
}
|
|
67
|
+
/** The configured base URL for a D-106 class, without a trailing slash. */
|
|
68
|
+
baseUrl(name) {
|
|
69
|
+
return this.baseUrls[name] ?? '';
|
|
70
|
+
}
|
|
71
|
+
/** A valid access token for the configured auth flow. The `signal` is
|
|
72
|
+
* accepted for contract symmetry; token acquisition is a shared refresh not
|
|
73
|
+
* bound to a single request's cancellation (mirroring the Rust runtime). */
|
|
74
|
+
async accessToken(_signal) {
|
|
75
|
+
return this.auth.accessToken();
|
|
76
|
+
}
|
|
77
|
+
/** A request envelope for a method and fully built URL. */
|
|
78
|
+
newRequest(method, url) {
|
|
79
|
+
return new Request(method, url);
|
|
80
|
+
}
|
|
81
|
+
/** Execute the request with retries: exponential backoff + full jitter, a
|
|
82
|
+
* single force-refresh on 401, and Retry-After (as a floor) on 429/5xx.
|
|
83
|
+
*
|
|
84
|
+
* Retry policy follows idempotency: a 429 (rate-limited, never processed)
|
|
85
|
+
* retries for every method; a transport error or a 5xx may have already
|
|
86
|
+
* committed a write, so those retry only for idempotent methods
|
|
87
|
+
* (GET/HEAD/PUT/DELETE/…). The 401 refresh applies to every method. */
|
|
88
|
+
async fetch(request, signal) {
|
|
89
|
+
let token = await this.auth.accessToken();
|
|
90
|
+
const query = request.query.toString();
|
|
91
|
+
const url = query ? `${request.url}?${query}` : request.url;
|
|
92
|
+
const idempotent = isIdempotent(request.method);
|
|
93
|
+
let refreshed = false;
|
|
94
|
+
let lastError;
|
|
95
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
96
|
+
const headers = new Headers(request.headers);
|
|
97
|
+
headers.set('Authorization', `Bearer ${token}`);
|
|
98
|
+
// `httpResponse` is the platform `Response` (via inference — the name is
|
|
99
|
+
// shadowed by this module's `Response` class, so it is never annotated).
|
|
100
|
+
let httpResponse;
|
|
101
|
+
try {
|
|
102
|
+
httpResponse = await fetch(url, {
|
|
103
|
+
method: request.method,
|
|
104
|
+
headers,
|
|
105
|
+
// A `Uint8Array` is a valid `BodyInit` at runtime; the cast bridges
|
|
106
|
+
// the `Uint8Array<ArrayBufferLike>` vs `BufferSource` generic gap in
|
|
107
|
+
// the DOM lib without narrowing the contract's plain-`Uint8Array` body.
|
|
108
|
+
body: request.body,
|
|
109
|
+
signal,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
// A transport error gives no response, so a non-idempotent write may
|
|
114
|
+
// already have committed — only retry idempotent methods.
|
|
115
|
+
lastError = err;
|
|
116
|
+
if (attempt === this.maxRetries || !idempotent) {
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
await sleep(backoff(attempt), signal);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const bodyBytes = new Uint8Array(await httpResponse.arrayBuffer());
|
|
123
|
+
const response = new Response(httpResponse.status, httpResponse.headers, bodyBytes);
|
|
124
|
+
// A single force-refresh on 401: re-acquire past the token cache so the
|
|
125
|
+
// retry doesn't just resend the same rejected token.
|
|
126
|
+
if (response.status === 401 && !refreshed) {
|
|
127
|
+
refreshed = true;
|
|
128
|
+
token = await this.auth.forceRefresh(token);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (shouldRetry(response.status, idempotent) && attempt < this.maxRetries) {
|
|
132
|
+
await sleep(retryDelay(response, attempt), signal);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
return response;
|
|
136
|
+
}
|
|
137
|
+
throw new BoxApiError(`request failed after ${this.maxRetries + 1} attempts`, {
|
|
138
|
+
cause: lastError,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** The safety ceiling on any single retry sleep, so a hostile server-sent
|
|
143
|
+
* Retry-After can't stall the client indefinitely. */
|
|
144
|
+
const MAX_RETRY_DELAY_MS = 30_000;
|
|
145
|
+
/** HTTP's idempotent methods: safe to replay after a transport error or 5xx. */
|
|
146
|
+
const IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']);
|
|
147
|
+
function isIdempotent(method) {
|
|
148
|
+
return IDEMPOTENT_METHODS.has(method.toUpperCase());
|
|
149
|
+
}
|
|
150
|
+
/** Whether a response status warrants a retry for a request of this idempotency.
|
|
151
|
+
* A 429 (rate-limited, never processed) retries for any method; a 5xx may have
|
|
152
|
+
* committed a write, so it retries only for idempotent methods. */
|
|
153
|
+
function shouldRetry(status, idempotent) {
|
|
154
|
+
return status === 429 || (status >= 500 && idempotent);
|
|
155
|
+
}
|
|
156
|
+
/** Full-jitter exponential backoff, capped at the max retry delay. */
|
|
157
|
+
function backoff(attempt) {
|
|
158
|
+
const base = Math.min(2 ** attempt * 500, MAX_RETRY_DELAY_MS);
|
|
159
|
+
return Math.random() * base;
|
|
160
|
+
}
|
|
161
|
+
/** The delay before the next retry: exponential backoff, raised to a
|
|
162
|
+
* (delay-seconds) Retry-After as a floor when present, and clamped to
|
|
163
|
+
* `MAX_RETRY_DELAY_MS`. HTTP-date Retry-After values fall back to backoff (the
|
|
164
|
+
* same posture as the Rust runtime). */
|
|
165
|
+
function retryDelay(response, attempt) {
|
|
166
|
+
let delay = backoff(attempt);
|
|
167
|
+
const header = response.headers.get('Retry-After');
|
|
168
|
+
if (header && /^\d+$/.test(header.trim())) {
|
|
169
|
+
delay = Math.max(delay, Number(header.trim()) * 1000);
|
|
170
|
+
}
|
|
171
|
+
return Math.min(delay, MAX_RETRY_DELAY_MS);
|
|
172
|
+
}
|
|
173
|
+
/** Sleep for `ms`, rejecting promptly if the signal aborts. */
|
|
174
|
+
function sleep(ms, signal) {
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
if (signal?.aborted) {
|
|
177
|
+
reject(abortError(signal));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const onAbort = () => {
|
|
181
|
+
clearTimeout(timer);
|
|
182
|
+
reject(abortError(signal));
|
|
183
|
+
};
|
|
184
|
+
const timer = setTimeout(() => {
|
|
185
|
+
signal?.removeEventListener('abort', onAbort);
|
|
186
|
+
resolve();
|
|
187
|
+
}, ms);
|
|
188
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function abortError(signal) {
|
|
192
|
+
const reason = signal?.reason;
|
|
193
|
+
return reason instanceof Error
|
|
194
|
+
? new BoxApiError(`request aborted: ${reason.message}`)
|
|
195
|
+
: new BoxApiError('request aborted');
|
|
196
|
+
}
|
|
197
|
+
/** Return the request with the header set. */
|
|
198
|
+
export function withHeader(request, name, value) {
|
|
199
|
+
request.headers.set(name, value);
|
|
200
|
+
return request;
|
|
201
|
+
}
|
|
202
|
+
/** Return the request with the query parameter appended, encoded. */
|
|
203
|
+
export function withQuery(request, name, value) {
|
|
204
|
+
request.query.append(name, value);
|
|
205
|
+
return request;
|
|
206
|
+
}
|
|
207
|
+
/** Return the request with the serialized JSON body and content type set. */
|
|
208
|
+
export function withJsonBody(request, body) {
|
|
209
|
+
request.headers.set('Content-Type', 'application/json');
|
|
210
|
+
request.body = body;
|
|
211
|
+
return request;
|
|
212
|
+
}
|
|
213
|
+
/** Return the request with an application/x-www-form-urlencoded body (the
|
|
214
|
+
* OAuth2 token endpoints). */
|
|
215
|
+
export function withFormBody(request, form) {
|
|
216
|
+
request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
|
|
217
|
+
request.body = form;
|
|
218
|
+
return request;
|
|
219
|
+
}
|
|
220
|
+
/** Return the request with a streaming body (buffered, so retries can replay
|
|
221
|
+
* it — the manifest's `Streaming` axis permits buffering). */
|
|
222
|
+
export function withStreamBody(request, body, contentType) {
|
|
223
|
+
request.headers.set('Content-Type', contentType);
|
|
224
|
+
request.body = body.data;
|
|
225
|
+
return request;
|
|
226
|
+
}
|
|
227
|
+
/** Return the request with a Box-style multipart body: an `attributes` JSON
|
|
228
|
+
* part plus a file part (G-7). */
|
|
229
|
+
export function withMultipartBody(request, attributes, fileName, file) {
|
|
230
|
+
const boundary = `----gantryFormBoundary${Math.random().toString(36).slice(2)}`;
|
|
231
|
+
const encoder = new TextEncoder();
|
|
232
|
+
const escaped = fileName.replace(/["\r\n]/g, '_');
|
|
233
|
+
const parts = [
|
|
234
|
+
encoder.encode(`--${boundary}\r\nContent-Disposition: form-data; name="attributes"\r\n\r\n`),
|
|
235
|
+
attributes,
|
|
236
|
+
encoder.encode(`\r\n--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${escaped}"\r\n` +
|
|
237
|
+
'Content-Type: application/octet-stream\r\n\r\n'),
|
|
238
|
+
file.data,
|
|
239
|
+
encoder.encode(`\r\n--${boundary}--\r\n`),
|
|
240
|
+
];
|
|
241
|
+
request.headers.set('Content-Type', `multipart/form-data; boundary=${boundary}`);
|
|
242
|
+
request.body = concat(parts);
|
|
243
|
+
return request;
|
|
244
|
+
}
|
|
245
|
+
/** Concatenate byte chunks into one buffer. */
|
|
246
|
+
function concat(chunks) {
|
|
247
|
+
const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
248
|
+
const out = new Uint8Array(total);
|
|
249
|
+
let offset = 0;
|
|
250
|
+
for (const chunk of chunks) {
|
|
251
|
+
out.set(chunk, offset);
|
|
252
|
+
offset += chunk.length;
|
|
253
|
+
}
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
/** Read the whole response body. */
|
|
257
|
+
export function responseBytes(response) {
|
|
258
|
+
return response.bodyBytes;
|
|
259
|
+
}
|
|
260
|
+
/** The response body as a stream, for binary downloads (FR-7.4). */
|
|
261
|
+
export function responseStream(response) {
|
|
262
|
+
return new Stream(response.bodyBytes);
|
|
263
|
+
}
|
|
264
|
+
/** A response header value, empty when absent (redirect Location, Retry-After
|
|
265
|
+
* surfacing). */
|
|
266
|
+
export function responseHeader(response, name) {
|
|
267
|
+
return response.headers.get(name) ?? '';
|
|
268
|
+
}
|
|
269
|
+
/** The response status code. */
|
|
270
|
+
export function statusCode(response) {
|
|
271
|
+
return response.status;
|
|
272
|
+
}
|