From d5ac06b69d388fd84a57886a9f43995c961135b8 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Tue, 28 Jan 2025 20:24:58 +0100 Subject: [PATCH 1/2] js: Replace OpenAPI generator http code with our own --- javascript/src/api/application.ts | 80 +++-- javascript/src/api/authentication.ts | 60 ++-- javascript/src/api/background_task.ts | 30 +- javascript/src/api/endpoint.ts | 310 +++++++++++------- javascript/src/api/event_type.ts | 92 ++++-- javascript/src/api/integration.ts | 103 +++--- javascript/src/api/message.ts | 84 +++-- javascript/src/api/message_attempt.ts | 157 ++++++--- .../src/api/operational_webhook_endpoint.ts | 97 ++++-- javascript/src/api/statistics.ts | 29 +- javascript/src/index.ts | 102 +++--- javascript/src/request.ts | 176 ++++++++++ javascript/src/util.ts | 16 + tools/bump_version.js | 2 +- 14 files changed, 876 insertions(+), 462 deletions(-) create mode 100644 javascript/src/request.ts diff --git a/javascript/src/api/application.ts b/javascript/src/api/application.ts index 289c59d53..d2367f4e4 100644 --- a/javascript/src/api/application.ts +++ b/javascript/src/api/application.ts @@ -1,13 +1,12 @@ -// this file is @generated (with the exception of getOrCreate) +// this file is @generated import { - Configuration, - ApplicationApi, ApplicationIn, ApplicationOut, ApplicationPatch, ListResponseApplicationOut, Ordering, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface ApplicationListOptions { @@ -20,18 +19,17 @@ export interface ApplicationListOptions { } export class Application { - private readonly api: ApplicationApi; - - public constructor(config: Configuration) { - this.api = new ApplicationApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** List of all the organization's applications. */ public list(options?: ApplicationListOptions): Promise { - return this.api.v1ApplicationList({ - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/app"); + + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("order", options?.order); + + return request.send(this.requestCtx); } /** Create a new application. */ @@ -39,10 +37,12 @@ export class Application { applicationIn: ApplicationIn, options?: PostOptions ): Promise { - return this.api.v1ApplicationCreate({ - applicationIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/app"); + + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = applicationIn; + + return request.send(this.requestCtx); } /** Get the application with the UID from `applicationIn`, or create it if it doesn't exist yet. */ @@ -50,33 +50,41 @@ export class Application { applicationIn: ApplicationIn, options?: PostOptions ): Promise { - return this.api.v1ApplicationCreate({ - applicationIn, - ...options, - getIfExists: true, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/app"); + + request.body = applicationIn; + request.setQueryParam("get_if_exists", true); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + + return request.send(this.requestCtx); } /** Get an application. */ public get(appId: string): Promise { - return this.api.v1ApplicationGet({ - appId, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/app/{app_id}"); + + request.setPathParam("app_id", appId); + + return request.send(this.requestCtx); } /** Update an application. */ public update(appId: string, applicationIn: ApplicationIn): Promise { - return this.api.v1ApplicationUpdate({ - appId, - applicationIn, - }); + const request = new SvixRequest(HttpMethod.PUT, "/api/v1/app/{app_id}"); + + request.setPathParam("app_id", appId); + request.body = applicationIn; + + return request.send(this.requestCtx); } /** Delete an application. */ public delete(appId: string): Promise { - return this.api.v1ApplicationDelete({ - appId, - }); + const request = new SvixRequest(HttpMethod.DELETE, "/api/v1/app/{app_id}"); + + request.setPathParam("app_id", appId); + + return request.sendNoResponseBody(this.requestCtx); } /** Partially update an application. */ @@ -84,9 +92,11 @@ export class Application { appId: string, applicationPatch: ApplicationPatch ): Promise { - return this.api.v1ApplicationPatch({ - appId, - applicationPatch, - }); + const request = new SvixRequest(HttpMethod.PATCH, "/api/v1/app/{app_id}"); + + request.setPathParam("app_id", appId); + request.body = applicationPatch; + + return request.send(this.requestCtx); } } diff --git a/javascript/src/api/authentication.ts b/javascript/src/api/authentication.ts index d59e2565d..35bf8a4f6 100644 --- a/javascript/src/api/authentication.ts +++ b/javascript/src/api/authentication.ts @@ -1,20 +1,15 @@ // this file is @generated import { - Configuration, - AuthenticationApi, AppPortalAccessIn, AppPortalAccessOut, ApplicationTokenExpireIn, DashboardAccessOut, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export class Authentication { - private readonly api: AuthenticationApi; - - public constructor(config: Configuration) { - this.api = new AuthenticationApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal. */ public appPortalAccess( @@ -22,11 +17,16 @@ export class Authentication { appPortalAccessIn: AppPortalAccessIn, options?: PostOptions ): Promise { - return this.api.v1AuthenticationAppPortalAccess({ - appId, - appPortalAccessIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/auth/app-portal-access/{app_id}" + ); + + request.setPathParam("app_id", appId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = appPortalAccessIn; + + return request.send(this.requestCtx); } /** Expire all of the tokens associated with a specific application. */ @@ -35,11 +35,16 @@ export class Authentication { applicationTokenExpireIn: ApplicationTokenExpireIn, options?: PostOptions ): Promise { - return this.api.v1AuthenticationExpireAll({ - appId, - applicationTokenExpireIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/auth/app/{app_id}/expire-all" + ); + + request.setPathParam("app_id", appId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = applicationTokenExpireIn; + + return request.sendNoResponseBody(this.requestCtx); } /** @@ -53,10 +58,15 @@ export class Authentication { appId: string, options?: PostOptions ): Promise { - return this.api.v1AuthenticationDashboardAccess({ - appId, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/auth/dashboard-access/{app_id}" + ); + + request.setPathParam("app_id", appId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + + return request.send(this.requestCtx); } /** @@ -65,8 +75,10 @@ export class Authentication { * Trying to log out other tokens will fail. */ public logout(options?: PostOptions): Promise { - return this.api.v1AuthenticationLogout({ - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/auth/logout"); + + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + + return request.sendNoResponseBody(this.requestCtx); } } diff --git a/javascript/src/api/background_task.ts b/javascript/src/api/background_task.ts index 16923cce3..b83f906a8 100644 --- a/javascript/src/api/background_task.ts +++ b/javascript/src/api/background_task.ts @@ -1,13 +1,12 @@ // this file is @generated import { - Configuration, - BackgroundTasksApi, BackgroundTaskOut, BackgroundTaskStatus, BackgroundTaskType, ListResponseBackgroundTaskOut, Ordering, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; export interface BackgroundTaskListOptions { /** Filter the response based on the status. */ @@ -23,20 +22,21 @@ export interface BackgroundTaskListOptions { } export class BackgroundTask { - private readonly api: BackgroundTasksApi; - - public constructor(config: Configuration) { - this.api = new BackgroundTasksApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** List background tasks executed in the past 90 days. */ public list( options?: BackgroundTaskListOptions ): Promise { - return this.api.listBackgroundTasks({ - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/background-task"); + + request.setQueryParam("status", options?.status); + request.setQueryParam("task", options?.task); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("order", options?.order); + + return request.send(this.requestCtx); } /** @@ -52,8 +52,10 @@ export class BackgroundTask { /** Get a background task by ID. */ public get(taskId: string): Promise { - return this.api.getBackgroundTask({ - taskId, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/background-task/{task_id}"); + + request.setPathParam("task_id", taskId); + + return request.send(this.requestCtx); } } diff --git a/javascript/src/api/endpoint.ts b/javascript/src/api/endpoint.ts index 41f33f391..e4248d2e9 100644 --- a/javascript/src/api/endpoint.ts +++ b/javascript/src/api/endpoint.ts @@ -1,7 +1,5 @@ -// this file is @generated (with manual changes) +// this file is @generated import { - Configuration, - EndpointApi, EndpointHeadersIn, EndpointHeadersOut, EndpointHeadersPatchIn, @@ -24,6 +22,7 @@ import { ReplayIn, ReplayOut, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface EndpointListOptions { @@ -43,22 +42,21 @@ export interface EndpointGetStatsOptions { } export class Endpoint { - private readonly api: EndpointApi; - - public constructor(config: Configuration) { - this.api = new EndpointApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** List the application's endpoints. */ public list( appId: string, options?: EndpointListOptions ): Promise { - return this.api.v1EndpointList({ - appId, - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/app/{app_id}/endpoint"); + + request.setPathParam("app_id", appId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("order", options?.order); + + return request.send(this.requestCtx); } /** @@ -71,19 +69,26 @@ export class Endpoint { endpointIn: EndpointIn, options?: PostOptions ): Promise { - return this.api.v1EndpointCreate({ - appId, - endpointIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/app/{app_id}/endpoint"); + + request.setPathParam("app_id", appId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = endpointIn; + + return request.send(this.requestCtx); } /** Get an endpoint. */ public get(appId: string, endpointId: string): Promise { - return this.api.v1EndpointGet({ - appId, - endpointId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + + return request.send(this.requestCtx); } /** Update an endpoint. */ @@ -92,19 +97,29 @@ export class Endpoint { endpointId: string, endpointUpdate: EndpointUpdate ): Promise { - return this.api.v1EndpointUpdate({ - appId, - endpointId, - endpointUpdate, - }); + const request = new SvixRequest( + HttpMethod.PUT, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.body = endpointUpdate; + + return request.send(this.requestCtx); } /** Delete an endpoint. */ public delete(appId: string, endpointId: string): Promise { - return this.api.v1EndpointDelete({ - appId, - endpointId, - }); + const request = new SvixRequest( + HttpMethod.DELETE, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + + return request.sendNoResponseBody(this.requestCtx); } /** Partially update an endpoint. */ @@ -113,19 +128,29 @@ export class Endpoint { endpointId: string, endpointPatch: EndpointPatch ): Promise { - return this.api.v1EndpointPatch({ - appId, - endpointId, - endpointPatch, - }); + const request = new SvixRequest( + HttpMethod.PATCH, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.body = endpointPatch; + + return request.send(this.requestCtx); } /** Get the additional headers to be sent with the webhook. */ public getHeaders(appId: string, endpointId: string): Promise { - return this.api.v1EndpointGetHeaders({ - appId, - endpointId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + + return request.send(this.requestCtx); } /** Set the additional headers to be sent with the webhook. */ @@ -134,11 +159,16 @@ export class Endpoint { endpointId: string, endpointHeadersIn: EndpointHeadersIn ): Promise { - return this.api.v1EndpointUpdateHeaders({ - appId, - endpointId, - endpointHeadersIn, - }); + const request = new SvixRequest( + HttpMethod.PUT, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.body = endpointHeadersIn; + + return request.sendNoResponseBody(this.requestCtx); } public headersUpdate( @@ -146,26 +176,25 @@ export class Endpoint { endpointId: string, endpointHeadersIn: EndpointHeadersIn ): Promise { - return this.api.v1EndpointUpdateHeaders({ - appId, - endpointId, - endpointHeadersIn, - }); + return this.updateHeaders(appId, endpointId, endpointHeadersIn); } - /** - * @deprecated Since version 1.30.0. Use `headersPatch` instead. - */ + /** Partially set the additional headers to be sent with the webhook. */ public patchHeaders( appId: string, endpointId: string, endpointHeadersPatchIn: EndpointHeadersPatchIn ): Promise { - return this.api.v1EndpointPatchHeaders({ - appId, - endpointId, - endpointHeadersPatchIn, - }); + const request = new SvixRequest( + HttpMethod.PATCH, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.body = endpointHeadersPatchIn; + + return request.sendNoResponseBody(this.requestCtx); } public headersPatch( @@ -173,11 +202,7 @@ export class Endpoint { endpointId: string, endpointHeadersPatchIn: EndpointHeadersPatchIn ): Promise { - return this.api.v1EndpointPatchHeaders({ - appId, - endpointId, - endpointHeadersPatchIn, - }); + return this.patchHeaders(appId, endpointId, endpointHeadersPatchIn); } /** @@ -191,12 +216,17 @@ export class Endpoint { recoverIn: RecoverIn, options?: PostOptions ): Promise { - return this.api.v1EndpointRecover({ - appId, - endpointId, - recoverIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = recoverIn; + + return request.send(this.requestCtx); } /** @@ -211,12 +241,17 @@ export class Endpoint { replayIn: ReplayIn, options?: PostOptions ): Promise { - return this.api.v1EndpointReplayMissing({ - appId, - endpointId, - replayIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/replay-missing" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = replayIn; + + return request.send(this.requestCtx); } /** @@ -226,10 +261,15 @@ export class Endpoint { * For more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/). */ public getSecret(appId: string, endpointId: string): Promise { - return this.api.v1EndpointGetSecret({ - appId, - endpointId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + + return request.send(this.requestCtx); } /** @@ -243,12 +283,17 @@ export class Endpoint { endpointSecretRotateIn: EndpointSecretRotateIn, options?: PostOptions ): Promise { - return this.api.v1EndpointRotateSecret({ - appId, - endpointId, - endpointSecretRotateIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = endpointSecretRotateIn; + + return request.sendNoResponseBody(this.requestCtx); } /** Send an example message for an event. */ @@ -258,12 +303,17 @@ export class Endpoint { eventExampleIn: EventExampleIn, options?: PostOptions ): Promise { - return this.api.v1EndpointSendExample({ - appId, - endpointId, - eventExampleIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/send-example" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = eventExampleIn; + + return request.send(this.requestCtx); } /** Get basic statistics for the endpoint. */ @@ -272,13 +322,17 @@ export class Endpoint { endpointId: string, options?: EndpointGetStatsOptions ): Promise { - return this.api.v1EndpointGetStats({ - appId, - endpointId, - ...options, - since: options?.since ?? undefined, - until: options?.until ?? undefined, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setQueryParam("since", options?.since); + request.setQueryParam("until", options?.until); + + return request.send(this.requestCtx); } /** Get the transformation code associated with this endpoint. */ @@ -286,10 +340,15 @@ export class Endpoint { appId: string, endpointId: string ): Promise { - return this.api.v1EndpointTransformationGet({ - appId, - endpointId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + + return request.send(this.requestCtx); } /** Set or unset the transformation code associated with this endpoint. */ @@ -298,29 +357,44 @@ export class Endpoint { endpointId: string, endpointTransformationIn: EndpointTransformationIn ): Promise { - return this.api.v1EndpointTransformationPartialUpdate({ - appId, - endpointId, - endpointTransformationIn, - }); + const request = new SvixRequest( + HttpMethod.PATCH, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.body = endpointTransformationIn; + + return request.sendNoResponseBody(this.requestCtx); } - public oauthUpdate( + public async oauthUpdate( appId: string, endpointId: string, endpointOauthConfigIn: EndpointOauthConfigIn ): Promise { - return this.api.v1EndpointUpdateOauthConfig({ - appId, - endpointId, - endpointOauthConfigIn, - }); + const request = new SvixRequest( + HttpMethod.PUT, + "/app/{app_id}/endpoint/{endpoint_id}/oauth" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.body = endpointOauthConfigIn; + + await request.send(this.requestCtx); } - public oauthDelete(appId: string, endpointId: string): Promise { - return this.api.v1EndpointDeleteOauthConfig({ - appId, - endpointId, - }); + public async oauthDelete(appId: string, endpointId: string): Promise { + const request = new SvixRequest( + HttpMethod.DELETE, + "/app/{app_id}/endpoint/{endpoint_id}/oauth" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + + await request.send(this.requestCtx); } } diff --git a/javascript/src/api/event_type.ts b/javascript/src/api/event_type.ts index 55dfd903a..b2fe8a5db 100644 --- a/javascript/src/api/event_type.ts +++ b/javascript/src/api/event_type.ts @@ -1,7 +1,5 @@ // this file is @generated import { - Configuration, - EventTypeApi, EventTypeImportOpenApiIn, EventTypeImportOpenApiOut, EventTypeIn, @@ -11,6 +9,7 @@ import { ListResponseEventTypeOut, Ordering, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface EventTypeListOptions { @@ -32,18 +31,19 @@ export interface EventTypeDeleteOptions { } export class EventType { - private readonly api: EventTypeApi; - - public constructor(config: Configuration) { - this.api = new EventTypeApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** Return the list of event types. */ public list(options?: EventTypeListOptions): Promise { - return this.api.v1EventTypeList({ - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/event-type"); + + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("order", options?.order); + request.setQueryParam("include_archived", options?.includeArchived); + request.setQueryParam("with_content", options?.withContent); + + return request.send(this.requestCtx); } /** @@ -54,10 +54,12 @@ export class EventType { * This operation does not preserve the description and schemas. */ public create(eventTypeIn: EventTypeIn, options?: PostOptions): Promise { - return this.api.v1EventTypeCreate({ - eventTypeIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/event-type"); + + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = eventTypeIn; + + return request.send(this.requestCtx); } /** @@ -71,17 +73,24 @@ export class EventType { eventTypeImportOpenApiIn: EventTypeImportOpenApiIn, options?: PostOptions ): Promise { - return this.api.v1EventTypeImportOpenapi({ - eventTypeImportOpenApiIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/event-type/import/openapi"); + + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = eventTypeImportOpenApiIn; + + return request.send(this.requestCtx); } /** Get an event type. */ public get(eventTypeName: string): Promise { - return this.api.v1EventTypeGet({ - eventTypeName, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/event-type/{event_type_name}" + ); + + request.setPathParam("event_type_name", eventTypeName); + + return request.send(this.requestCtx); } /** Update an event type. */ @@ -89,10 +98,15 @@ export class EventType { eventTypeName: string, eventTypeUpdate: EventTypeUpdate ): Promise { - return this.api.v1EventTypeUpdate({ - eventTypeName, - eventTypeUpdate, - }); + const request = new SvixRequest( + HttpMethod.PUT, + "/api/v1/event-type/{event_type_name}" + ); + + request.setPathParam("event_type_name", eventTypeName); + request.body = eventTypeUpdate; + + return request.send(this.requestCtx); } /** @@ -104,10 +118,15 @@ export class EventType { * [create operation](#operation/create_event_type_api_v1_event_type__post). */ public delete(eventTypeName: string, options?: EventTypeDeleteOptions): Promise { - return this.api.v1EventTypeDelete({ - eventTypeName, - ...options, - }); + const request = new SvixRequest( + HttpMethod.DELETE, + "/api/v1/event-type/{event_type_name}" + ); + + request.setPathParam("event_type_name", eventTypeName); + request.setQueryParam("expunge", options?.expunge); + + return request.sendNoResponseBody(this.requestCtx); } /** Partially update an event type. */ @@ -115,9 +134,14 @@ export class EventType { eventTypeName: string, eventTypePatch: EventTypePatch ): Promise { - return this.api.v1EventTypePatch({ - eventTypeName, - eventTypePatch, - }); + const request = new SvixRequest( + HttpMethod.PATCH, + "/api/v1/event-type/{event_type_name}" + ); + + request.setPathParam("event_type_name", eventTypeName); + request.body = eventTypePatch; + + return request.send(this.requestCtx); } } diff --git a/javascript/src/api/integration.ts b/javascript/src/api/integration.ts index ec18275aa..d435b5000 100644 --- a/javascript/src/api/integration.ts +++ b/javascript/src/api/integration.ts @@ -1,7 +1,5 @@ // this file is @generated import { - Configuration, - IntegrationApi, IntegrationIn, IntegrationKeyOut, IntegrationOut, @@ -9,6 +7,7 @@ import { ListResponseIntegrationOut, Ordering, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface IntegrationListOptions { @@ -21,22 +20,21 @@ export interface IntegrationListOptions { } export class Integration { - private readonly api: IntegrationApi; - - public constructor(config: Configuration) { - this.api = new IntegrationApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** List the application's integrations. */ public list( appId: string, options?: IntegrationListOptions ): Promise { - return this.api.v1IntegrationList({ - appId, - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/app/{app_id}/integration"); + + request.setPathParam("app_id", appId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("order", options?.order); + + return request.send(this.requestCtx); } /** Create an integration. */ @@ -45,19 +43,26 @@ export class Integration { integrationIn: IntegrationIn, options?: PostOptions ): Promise { - return this.api.v1IntegrationCreate({ - appId, - integrationIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/app/{app_id}/integration"); + + request.setPathParam("app_id", appId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = integrationIn; + + return request.send(this.requestCtx); } /** Get an integration. */ public get(appId: string, integId: string): Promise { - return this.api.v1IntegrationGet({ - appId, - integId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/integration/{integ_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("integ_id", integId); + + return request.send(this.requestCtx); } /** Update an integration. */ @@ -66,19 +71,29 @@ export class Integration { integId: string, integrationUpdate: IntegrationUpdate ): Promise { - return this.api.v1IntegrationUpdate({ - appId, - integId, - integrationUpdate, - }); + const request = new SvixRequest( + HttpMethod.PUT, + "/api/v1/app/{app_id}/integration/{integ_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("integ_id", integId); + request.body = integrationUpdate; + + return request.send(this.requestCtx); } /** Delete an integration. */ public delete(appId: string, integId: string): Promise { - return this.api.v1IntegrationDelete({ - appId, - integId, - }); + const request = new SvixRequest( + HttpMethod.DELETE, + "/api/v1/app/{app_id}/integration/{integ_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("integ_id", integId); + + return request.sendNoResponseBody(this.requestCtx); } /** @@ -87,10 +102,15 @@ export class Integration { * @deprecated */ public getKey(appId: string, integId: string): Promise { - return this.api.v1IntegrationGetKey({ - appId, - integId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/integration/{integ_id}/key" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("integ_id", integId); + + return request.send(this.requestCtx); } /** Rotate the integration's key. The previous key will be immediately revoked. */ @@ -99,10 +119,15 @@ export class Integration { integId: string, options?: PostOptions ): Promise { - return this.api.v1IntegrationRotateKey({ - appId, - integId, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/app/{app_id}/integration/{integ_id}/key/rotate" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("integ_id", integId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + + return request.send(this.requestCtx); } } diff --git a/javascript/src/api/message.ts b/javascript/src/api/message.ts index 74b873bed..362b730e6 100644 --- a/javascript/src/api/message.ts +++ b/javascript/src/api/message.ts @@ -1,11 +1,6 @@ -// this file is @generated (with minor manual changes) -import { - Configuration, - MessageApi, - ListResponseMessageOut, - MessageIn, - MessageOut, -} from "../openapi"; +// this file is @generated +import { ListResponseMessageOut, MessageIn, MessageOut } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface MessageListOptions { @@ -27,12 +22,13 @@ export interface MessageListOptions { eventTypes?: string[]; } -export class Message { - private readonly api: MessageApi; +export interface MessageGetOptions { + /** When `true` message payloads are included in the response. */ + withContent?: boolean; +} - public constructor(config: Configuration) { - this.api = new MessageApi(config); - } +export class Message { + public constructor(private readonly requestCtx: SvixRequestContext) {} /** * List all of the application's messages. @@ -49,13 +45,19 @@ export class Message { appId: string, options?: MessageListOptions ): Promise { - return this.api.v1MessageList({ - appId, - ...options, - iterator: options?.iterator ?? undefined, - before: options?.before ?? undefined, - after: options?.after ?? undefined, - }); + const request = new SvixRequest(HttpMethod.GET, "/api/v1/app/{app_id}/msg"); + + request.setPathParam("app_id", appId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("channel", options?.channel); + request.setQueryParam("before", options?.before); + request.setQueryParam("after", options?.after); + request.setQueryParam("with_content", options?.withContent); + request.setQueryParam("tag", options?.tag); + request.setQueryParam("event_types", options?.eventTypes); + + return request.send(this.requestCtx); } /** @@ -74,19 +76,28 @@ export class Message { messageIn: MessageIn, options?: PostOptions ): Promise { - return this.api.v1MessageCreate({ - appId, - messageIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/app/{app_id}/msg"); + + request.setPathParam("app_id", appId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = messageIn; + + return request.send(this.requestCtx); } /** Get a message by its ID or eventID. */ - public get(appId: string, msgId: string): Promise { - return this.api.v1MessageGet({ - appId, - msgId, - }); + public get( + appId: string, + msgId: string, + options?: MessageGetOptions + ): Promise { + const request = new SvixRequest(HttpMethod.GET, "/api/v1/app/{app_id}/msg/{msg_id}"); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + request.setQueryParam("with_content", options?.withContent); + + return request.send(this.requestCtx); } /** @@ -96,10 +107,15 @@ export class Message { * The message can't be replayed or resent once its payload has been deleted or expired. */ public expungeContent(appId: string, msgId: string): Promise { - return this.api.v1MessageExpungeContent({ - appId, - msgId, - }); + const request = new SvixRequest( + HttpMethod.DELETE, + "/api/v1/app/{app_id}/msg/{msg_id}/content" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + + return request.sendNoResponseBody(this.requestCtx); } } diff --git a/javascript/src/api/message_attempt.ts b/javascript/src/api/message_attempt.ts index a82d56139..3e0807ff2 100644 --- a/javascript/src/api/message_attempt.ts +++ b/javascript/src/api/message_attempt.ts @@ -1,7 +1,5 @@ -// this file is @generated (with minor manual changes) +// this file is @generated import { - Configuration, - MessageAttemptApi, ListResponseEndpointMessageOut, ListResponseMessageAttemptOut, ListResponseMessageEndpointOut, @@ -9,6 +7,7 @@ import { MessageStatus, StatusCodeClass, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface MessageAttemptListOptions { @@ -102,11 +101,7 @@ export interface MessageAttemptListAttemptedDestinationsOptions { } export class MessageAttempt { - private readonly api: MessageAttemptApi; - - public constructor(config: Configuration) { - this.api = new MessageAttemptApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** * @deprecated Since version 0.48.0. Use listByMsg or listByEndpoint instead. @@ -132,14 +127,26 @@ export class MessageAttempt { endpointId: string, options?: MessageAttemptListByEndpointOptions ): Promise { - return this.api.v1MessageAttemptListByEndpoint({ - appId, - endpointId, - ...options, - iterator: options?.iterator ?? undefined, - before: options?.before ?? undefined, - after: options?.after ?? undefined, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("status", options?.status); + request.setQueryParam("status_code_class", options?.statusCodeClass); + request.setQueryParam("channel", options?.channel); + request.setQueryParam("tag", options?.tag); + request.setQueryParam("before", options?.before); + request.setQueryParam("after", options?.after); + request.setQueryParam("with_content", options?.withContent); + request.setQueryParam("with_msg", options?.withMsg); + request.setQueryParam("event_types", options?.eventTypes); + + return request.send(this.requestCtx); } /** @@ -155,14 +162,26 @@ export class MessageAttempt { msgId: string, options?: MessageAttemptListByMsgOptions ): Promise { - return this.api.v1MessageAttemptListByMsg({ - appId, - msgId, - ...options, - iterator: options?.iterator ?? undefined, - before: options?.before ?? undefined, - after: options?.after ?? undefined, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/attempt/msg/{msg_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("status", options?.status); + request.setQueryParam("status_code_class", options?.statusCodeClass); + request.setQueryParam("channel", options?.channel); + request.setQueryParam("tag", options?.tag); + request.setQueryParam("endpoint_id", options?.endpointId); + request.setQueryParam("before", options?.before); + request.setQueryParam("after", options?.after); + request.setQueryParam("with_content", options?.withContent); + request.setQueryParam("event_types", options?.eventTypes); + + return request.send(this.requestCtx); } /** @@ -180,14 +199,24 @@ export class MessageAttempt { endpointId: string, options?: MessageAttemptListAttemptedMessagesOptions ): Promise { - return this.api.v1MessageAttemptListAttemptedMessages({ - appId, - endpointId, - ...options, - iterator: options?.iterator ?? undefined, - before: options?.before ?? undefined, - after: options?.after ?? undefined, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("endpoint_id", endpointId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("channel", options?.channel); + request.setQueryParam("tag", options?.tag); + request.setQueryParam("status", options?.status); + request.setQueryParam("before", options?.before); + request.setQueryParam("after", options?.after); + request.setQueryParam("with_content", options?.withContent); + request.setQueryParam("event_types", options?.eventTypes); + + return request.send(this.requestCtx); } /** `msg_id`: Use a message id or a message `eventId` */ @@ -196,11 +225,16 @@ export class MessageAttempt { msgId: string, attemptId: string ): Promise { - return this.api.v1MessageAttemptGet({ - appId, - msgId, - attemptId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + request.setPathParam("attempt_id", attemptId); + + return request.send(this.requestCtx); } /** @@ -210,11 +244,16 @@ export class MessageAttempt { * The message can't be replayed or resent once its payload has been deleted or expired. */ public expungeContent(appId: string, msgId: string, attemptId: string): Promise { - return this.api.v1MessageAttemptExpungeContent({ - appId, - msgId, - attemptId, - }); + const request = new SvixRequest( + HttpMethod.DELETE, + "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + request.setPathParam("attempt_id", attemptId); + + return request.sendNoResponseBody(this.requestCtx); } /** @@ -228,12 +267,17 @@ export class MessageAttempt { msgId: string, options?: MessageAttemptListAttemptedDestinationsOptions ): Promise { - return this.api.v1MessageAttemptListAttemptedDestinations({ - appId, - msgId, - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/app/{app_id}/msg/{msg_id}/endpoint" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + + return request.send(this.requestCtx); } /** Resend a message to the specified endpoint. */ @@ -243,11 +287,16 @@ export class MessageAttempt { endpointId: string, options?: PostOptions ): Promise { - return this.api.v1MessageAttemptResend({ - appId, - msgId, - endpointId, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend" + ); + + request.setPathParam("app_id", appId); + request.setPathParam("msg_id", msgId); + request.setPathParam("endpoint_id", endpointId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + + return request.sendNoResponseBody(this.requestCtx); } } diff --git a/javascript/src/api/operational_webhook_endpoint.ts b/javascript/src/api/operational_webhook_endpoint.ts index 92f2edeff..82ad5c935 100644 --- a/javascript/src/api/operational_webhook_endpoint.ts +++ b/javascript/src/api/operational_webhook_endpoint.ts @@ -1,7 +1,5 @@ // this file is @generated import { - Configuration, - WebhookEndpointApi, ListResponseOperationalWebhookEndpointOut, OperationalWebhookEndpointIn, OperationalWebhookEndpointOut, @@ -10,6 +8,7 @@ import { OperationalWebhookEndpointUpdate, Ordering, } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export interface OperationalWebhookEndpointListOptions { @@ -22,20 +21,22 @@ export interface OperationalWebhookEndpointListOptions { } export class OperationalWebhookEndpoint { - private readonly api: WebhookEndpointApi; - - public constructor(config: Configuration) { - this.api = new WebhookEndpointApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** List operational webhook endpoints. */ public list( options?: OperationalWebhookEndpointListOptions ): Promise { - return this.api.listOperationalWebhookEndpoints({ - ...options, - iterator: options?.iterator ?? undefined, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/operational-webhook/endpoint" + ); + + request.setQueryParam("limit", options?.limit); + request.setQueryParam("iterator", options?.iterator); + request.setQueryParam("order", options?.order); + + return request.send(this.requestCtx); } /** Create an operational webhook endpoint. */ @@ -43,17 +44,27 @@ export class OperationalWebhookEndpoint { operationalWebhookEndpointIn: OperationalWebhookEndpointIn, options?: PostOptions ): Promise { - return this.api.createOperationalWebhookEndpoint({ - operationalWebhookEndpointIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/operational-webhook/endpoint" + ); + + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = operationalWebhookEndpointIn; + + return request.send(this.requestCtx); } /** Get an operational webhook endpoint. */ public get(endpointId: string): Promise { - return this.api.getOperationalWebhookEndpoint({ - endpointId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/operational-webhook/endpoint/{endpoint_id}" + ); + + request.setPathParam("endpoint_id", endpointId); + + return request.send(this.requestCtx); } /** Update an operational webhook endpoint. */ @@ -61,17 +72,27 @@ export class OperationalWebhookEndpoint { endpointId: string, operationalWebhookEndpointUpdate: OperationalWebhookEndpointUpdate ): Promise { - return this.api.updateOperationalWebhookEndpoint({ - endpointId, - operationalWebhookEndpointUpdate, - }); + const request = new SvixRequest( + HttpMethod.PUT, + "/api/v1/operational-webhook/endpoint/{endpoint_id}" + ); + + request.setPathParam("endpoint_id", endpointId); + request.body = operationalWebhookEndpointUpdate; + + return request.send(this.requestCtx); } /** Delete an operational webhook endpoint. */ public delete(endpointId: string): Promise { - return this.api.deleteOperationalWebhookEndpoint({ - endpointId, - }); + const request = new SvixRequest( + HttpMethod.DELETE, + "/api/v1/operational-webhook/endpoint/{endpoint_id}" + ); + + request.setPathParam("endpoint_id", endpointId); + + return request.sendNoResponseBody(this.requestCtx); } /** @@ -81,9 +102,14 @@ export class OperationalWebhookEndpoint { * For more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/). */ public getSecret(endpointId: string): Promise { - return this.api.getOperationalWebhookEndpointSecret({ - endpointId, - }); + const request = new SvixRequest( + HttpMethod.GET, + "/api/v1/operational-webhook/endpoint/{endpoint_id}/secret" + ); + + request.setPathParam("endpoint_id", endpointId); + + return request.send(this.requestCtx); } /** @@ -96,10 +122,15 @@ export class OperationalWebhookEndpoint { operationalWebhookEndpointSecretIn: OperationalWebhookEndpointSecretIn, options?: PostOptions ): Promise { - return this.api.rotateOperationalWebhookEndpointSecret({ - endpointId, - operationalWebhookEndpointSecretIn, - ...options, - }); + const request = new SvixRequest( + HttpMethod.POST, + "/api/v1/operational-webhook/endpoint/{endpoint_id}/secret/rotate" + ); + + request.setPathParam("endpoint_id", endpointId); + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = operationalWebhookEndpointSecretIn; + + return request.sendNoResponseBody(this.requestCtx); } } diff --git a/javascript/src/api/statistics.ts b/javascript/src/api/statistics.ts index 853da686d..ca1a68621 100644 --- a/javascript/src/api/statistics.ts +++ b/javascript/src/api/statistics.ts @@ -1,19 +1,10 @@ // this file is @generated -import { - Configuration, - StatisticsApi, - AggregateEventTypesOut, - AppUsageStatsIn, - AppUsageStatsOut, -} from "../openapi"; +import { AggregateEventTypesOut, AppUsageStatsIn, AppUsageStatsOut } from "../openapi"; +import { HttpMethod, SvixRequest, SvixRequestContext } from "../request"; import { PostOptions } from "../util"; export class Statistics { - private readonly api: StatisticsApi; - - public constructor(config: Configuration) { - this.api = new StatisticsApi(config); - } + public constructor(private readonly requestCtx: SvixRequestContext) {} /** * Creates a background task to calculate the message destinations for all applications in the environment. @@ -25,10 +16,12 @@ export class Statistics { appUsageStatsIn: AppUsageStatsIn, options?: PostOptions ): Promise { - return this.api.v1StatisticsAggregateAppStats({ - appUsageStatsIn, - ...options, - }); + const request = new SvixRequest(HttpMethod.POST, "/api/v1/stats/usage/app"); + + request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.body = appUsageStatsIn; + + return request.send(this.requestCtx); } /** @@ -38,6 +31,8 @@ export class Statistics { * retrieve the results of the operation. */ public aggregateEventTypes(): Promise { - return this.api.v1StatisticsAggregateEventTypes({}); + const request = new SvixRequest(HttpMethod.PUT, "/api/v1/stats/usage/event-types"); + + return request.send(this.requestCtx); } } diff --git a/javascript/src/index.ts b/javascript/src/index.ts index 1743a1ef9..0ab3fefcf 100644 --- a/javascript/src/index.ts +++ b/javascript/src/index.ts @@ -1,12 +1,3 @@ -import { - ServerConfiguration, - HttpBearerConfiguration, - Configuration, - createConfiguration, - Middleware, - RequestContext, - ResponseContext, -} from "./openapi"; import { Authentication } from "./api/authentication"; import { Application } from "./api/application"; import { BackgroundTask } from "./api/background_task"; @@ -17,6 +8,7 @@ import { Message } from "./api/message"; import { MessageAttempt } from "./api/message_attempt"; import { OperationalWebhookEndpoint } from "./api/operational_webhook_endpoint"; import { Statistics } from "./api/statistics"; +import { SvixRequestContext } from "./request"; export * from "./openapi/models/all"; export * from "./openapi/apis/exception"; @@ -36,19 +28,6 @@ export { } from "./api/message_attempt"; export { OperationalWebhookEndpointListOptions } from "./api/operational_webhook_endpoint"; -const VERSION = "1.56.0"; - -class UserAgentMiddleware implements Middleware { - public pre(context: RequestContext): Promise { - context.setHeaderParam("User-Agent", `svix-libs/${VERSION}/javascript`); - return Promise.resolve(context); - } - - public post(context: ResponseContext): Promise { - return Promise.resolve(context); - } -} - export interface SvixOptions { debug?: boolean; serverUrl?: string; @@ -61,47 +40,52 @@ const REGIONS = [ ]; export class Svix { - public readonly _configuration: Configuration; - public readonly authentication: Authentication; - public readonly application: Application; - public readonly endpoint: Endpoint; - public readonly eventType: EventType; - public readonly integration: Integration; - public readonly message: Message; - public readonly messageAttempt: MessageAttempt; - public readonly backgroundTask: BackgroundTask; - public readonly statistics: Statistics; - public readonly operationalWebhookEndpoint: OperationalWebhookEndpoint; + private readonly requestCtx: SvixRequestContext; public constructor(token: string, options: SvixOptions = {}) { const regionalUrl = REGIONS.find((x) => x.region === token.split(".")[1])?.url; const baseUrl: string = options.serverUrl ?? regionalUrl ?? "https://api.svix.com"; - const baseServer = new ServerConfiguration(baseUrl, {}); - - const bearerConfiguration: HttpBearerConfiguration = { - tokenProvider: { - getToken: () => token, - }, - }; - const config = createConfiguration({ - baseServer, - promiseMiddleware: [new UserAgentMiddleware()], - authMethods: { - HTTPBearer: bearerConfiguration, - }, - }); - - this._configuration = config; - this.authentication = new Authentication(config); - this.application = new Application(config); - this.endpoint = new Endpoint(config); - this.eventType = new EventType(config); - this.integration = new Integration(config); - this.message = new Message(config); - this.messageAttempt = new MessageAttempt(config); - this.backgroundTask = new BackgroundTask(config); - this.statistics = new Statistics(config); - this.operationalWebhookEndpoint = new OperationalWebhookEndpoint(config); + this.requestCtx = { baseUrl, token }; + } + + public get authentication() { + return new Authentication(this.requestCtx); + } + + public get application() { + return new Application(this.requestCtx); + } + + public get endpoint() { + return new Endpoint(this.requestCtx); + } + + public get eventType() { + return new EventType(this.requestCtx); + } + + public get integration() { + return new Integration(this.requestCtx); + } + + public get message() { + return new Message(this.requestCtx); + } + + public get messageAttempt() { + return new MessageAttempt(this.requestCtx); + } + + public get backgroundTask() { + return new BackgroundTask(this.requestCtx); + } + + public get statistics() { + return new Statistics(this.requestCtx); + } + + public get operationalWebhookEndpoint() { + return new OperationalWebhookEndpoint(this.requestCtx); } } diff --git a/javascript/src/request.ts b/javascript/src/request.ts new file mode 100644 index 000000000..745e5d4c5 --- /dev/null +++ b/javascript/src/request.ts @@ -0,0 +1,176 @@ +import "svix-fetch"; +import { ApiException } from "./util"; +import { HttpErrorOut, HTTPValidationError } from "./openapi"; + +const LIB_VERSION = "1.56.0"; + +export enum HttpMethod { + GET = "GET", + HEAD = "HEAD", + POST = "POST", + PUT = "PUT", + DELETE = "DELETE", + CONNECT = "CONNECT", + OPTIONS = "OPTIONS", + TRACE = "TRACE", + PATCH = "PATCH", +} + +export interface SvixRequestContext { + /** The API base URL, like "https://api.svix.com" */ + baseUrl: string; + /** The 'bearer' scheme access token */ + token: string; +} + +type QueryParameter = string | boolean | number | Date | string[] | null | undefined; + +export class SvixRequest { + constructor( + private readonly method: HttpMethod, + private path: string + ) {} + + public body?: any; + private queryParams: Record = {}; + private headerParams: Record = {}; + + public setPathParam(name: string, value: string) { + const newPath = this.path.replace(`{${name}}`, encodeURIComponent(value)); + if (this.path === newPath) { + throw new Error(`path parameter ${name} not found`); + } + this.path = newPath; + } + + public setQueryParam(name: string, value: QueryParameter) { + if (value === undefined || value === null) { + return; + } + + if (typeof value === "string") { + this.queryParams[name] = value; + } else if (typeof value === "boolean" || typeof value === "number") { + this.queryParams[name] = value.toString(); + } else if (value instanceof Date) { + this.queryParams[name] = value.toISOString(); + } else if (value instanceof Array) { + this.queryParams[name] = value.join(","); + } else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const _assert_unreachable: never = value; + throw new Error(`query parameter ${name} has unsupported type`); + } + } + + public setHeaderParam(name: string, value?: string) { + if (value === undefined) { + return; + } + + this.headerParams[name] = value; + } + + /** + * Send this request, returning the request body as a caller-specified type. + * + * If the server returns a 422 error, an `ApiException` is thrown. + * If the server returns another 4xx error, an `ApiException` is thrown. + * + * If the server returns a 5xx error, the request is retried up to two times with exponential backoff. + * If retries are exhausted, an `ApiException` is thrown. + */ + public async send(ctx: SvixRequestContext): Promise { + const responseBody = await this.sendInner(ctx); + return JSON.parse(responseBody); + } + + /** Same as `send`, but the response body is discarded, not parsed. */ + public async sendNoResponseBody(ctx: SvixRequestContext): Promise { + await this.sendInner(ctx); + } + + private async sendInner(ctx: SvixRequestContext): Promise { + const url = new URL(ctx.baseUrl + this.path); + for (const [name, value] of Object.entries(this.queryParams)) { + url.searchParams.set(name, value); + } + + const randomId = Math.floor(Math.random() * Math.pow(2, 32)); + + let body: string | undefined; + if (this.body !== undefined) { + body = JSON.stringify(this.body); + } + + // Cloudflare Workers fail if the credentials option is used in a fetch call. + // This work around that. Source: + // https://github.com/cloudflare/workers-sdk/issues/2514#issuecomment-2178070014 + const isCredentialsSupported = "credentials" in Request.prototype; + + const response = await sendWithRetry(url, { + method: this.method.toString(), + body, + headers: { + accept: "application/json, */*;q=0.8", + "user-agent": `svix-libs/${LIB_VERSION}/javascript`, + "svix-req-id": randomId.toString(), + ...this.headerParams, + }, + credentials: isCredentialsSupported ? "same-origin" : undefined, + }); + + const responseBody = await response.text(); + + if (response.status < 300) { + // success case + return responseBody; + } else if (response.status === 422) { + const body = JSON.parse(responseBody); + throw new ApiException( + response.status, + body as HTTPValidationError, + response.headers + ); + } else if (response.status >= 400) { + const body = JSON.parse(responseBody); + throw new ApiException( + response.status, + body as HttpErrorOut, + response.headers + ); + } else { + throw new ApiException(response.status, responseBody, response.headers); + } + } +} + +type SvixRequestInit = RequestInit & { + headers: Record; +}; + +async function sendWithRetry( + url: URL, + init: SvixRequestInit, + triesLeft = 2, + nextInterval = 50, + retryCount = 1 +): Promise { + const sleep = (interval: number) => + new Promise((resolve) => setTimeout(resolve, interval)); + + try { + const response = await fetch(url, init); + if (triesLeft <= 0 || response.status < 500) { + return response; + } + } catch (e) { + if (triesLeft <= 0) { + throw e; + } + } + + await sleep(nextInterval); + init.headers["svix-retry-count"] = retryCount.toString(); + return await sendWithRetry(url, init, --triesLeft, nextInterval * 2, ++retryCount); +} diff --git a/javascript/src/util.ts b/javascript/src/util.ts index 2bcc456ce..ea0582e48 100644 --- a/javascript/src/util.ts +++ b/javascript/src/util.ts @@ -1,3 +1,19 @@ export interface PostOptions { idempotencyKey?: string; } + +export class ApiException extends Error { + public headers: Record = {}; + + public constructor( + public code: number, + public body: T, + headers: Headers + ) { + super(`HTTP-Code: ${code}\nHeaders: ${JSON.stringify(headers)}`); + + headers.forEach((value: string, name: string) => { + this.headers[name] = value; + }); + } +} diff --git a/tools/bump_version.js b/tools/bump_version.js index 47c6ee15c..ee19a5135 100755 --- a/tools/bump_version.js +++ b/tools/bump_version.js @@ -25,7 +25,7 @@ const filesPaths = [ "java/lib/src/main/java/com/svix/Svix.java", // Javascript "javascript/package.json", - "javascript/src/index.ts", + "javascript/src/request.ts", // Kotlin "kotlin/gradle.properties", "kotlin/README.md", From d2f38e4b1749ae2d72cff5d278860647ae6f87ad Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Wed, 29 Jan 2025 16:16:39 +0100 Subject: [PATCH 2/2] js: Move user agent out into a module level const --- javascript/src/api/application.ts | 20 +++---- javascript/src/api/authentication.ts | 8 +-- javascript/src/api/background_task.ts | 4 +- javascript/src/api/endpoint.ts | 54 +++++++++---------- javascript/src/api/event_type.ts | 20 +++---- javascript/src/api/integration.ts | 16 +++--- javascript/src/api/message.ts | 8 +-- javascript/src/api/message_attempt.ts | 10 ++-- .../src/api/operational_webhook_endpoint.ts | 19 ++++--- javascript/src/api/statistics.ts | 6 +-- javascript/src/request.ts | 21 ++++---- 11 files changed, 95 insertions(+), 91 deletions(-) diff --git a/javascript/src/api/application.ts b/javascript/src/api/application.ts index d2367f4e4..e6ebb8931 100644 --- a/javascript/src/api/application.ts +++ b/javascript/src/api/application.ts @@ -29,7 +29,7 @@ export class Application { request.setQueryParam("iterator", options?.iterator); request.setQueryParam("order", options?.order); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseApplicationOut"); } /** Create a new application. */ @@ -40,9 +40,9 @@ export class Application { const request = new SvixRequest(HttpMethod.POST, "/api/v1/app"); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = applicationIn; + request.setBody(applicationIn, "ApplicationIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ApplicationOut"); } /** Get the application with the UID from `applicationIn`, or create it if it doesn't exist yet. */ @@ -52,11 +52,11 @@ export class Application { ): Promise { const request = new SvixRequest(HttpMethod.POST, "/api/v1/app"); - request.body = applicationIn; request.setQueryParam("get_if_exists", true); request.setHeaderParam("idempotency-key", options?.idempotencyKey); + request.setBody(applicationIn, "ApplicationIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ApplicationOut"); } /** Get an application. */ @@ -65,7 +65,7 @@ export class Application { request.setPathParam("app_id", appId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ApplicationOut"); } /** Update an application. */ @@ -73,9 +73,9 @@ export class Application { const request = new SvixRequest(HttpMethod.PUT, "/api/v1/app/{app_id}"); request.setPathParam("app_id", appId); - request.body = applicationIn; + request.setBody(applicationIn, "ApplicationIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ApplicationOut"); } /** Delete an application. */ @@ -95,8 +95,8 @@ export class Application { const request = new SvixRequest(HttpMethod.PATCH, "/api/v1/app/{app_id}"); request.setPathParam("app_id", appId); - request.body = applicationPatch; + request.setBody(applicationPatch, "ApplicationPatch"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ApplicationOut"); } } diff --git a/javascript/src/api/authentication.ts b/javascript/src/api/authentication.ts index 35bf8a4f6..4d85c04cd 100644 --- a/javascript/src/api/authentication.ts +++ b/javascript/src/api/authentication.ts @@ -24,9 +24,9 @@ export class Authentication { request.setPathParam("app_id", appId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = appPortalAccessIn; + request.setBody(appPortalAccessIn, "AppPortalAccessIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "AppPortalAccessOut"); } /** Expire all of the tokens associated with a specific application. */ @@ -42,7 +42,7 @@ export class Authentication { request.setPathParam("app_id", appId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = applicationTokenExpireIn; + request.setBody(applicationTokenExpireIn, "ApplicationTokenExpireIn"); return request.sendNoResponseBody(this.requestCtx); } @@ -66,7 +66,7 @@ export class Authentication { request.setPathParam("app_id", appId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "DashboardAccessOut"); } /** diff --git a/javascript/src/api/background_task.ts b/javascript/src/api/background_task.ts index b83f906a8..7bf90d533 100644 --- a/javascript/src/api/background_task.ts +++ b/javascript/src/api/background_task.ts @@ -36,7 +36,7 @@ export class BackgroundTask { request.setQueryParam("iterator", options?.iterator); request.setQueryParam("order", options?.order); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseBackgroundTaskOut"); } /** @@ -56,6 +56,6 @@ export class BackgroundTask { request.setPathParam("task_id", taskId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "BackgroundTaskOut"); } } diff --git a/javascript/src/api/endpoint.ts b/javascript/src/api/endpoint.ts index e4248d2e9..2bbf731e7 100644 --- a/javascript/src/api/endpoint.ts +++ b/javascript/src/api/endpoint.ts @@ -56,7 +56,7 @@ export class Endpoint { request.setQueryParam("iterator", options?.iterator); request.setQueryParam("order", options?.order); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseEndpointOut"); } /** @@ -73,9 +73,9 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = endpointIn; + request.setBody(endpointIn, "EndpointIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointOut"); } /** Get an endpoint. */ @@ -88,7 +88,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointOut"); } /** Update an endpoint. */ @@ -104,9 +104,9 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - request.body = endpointUpdate; + request.setBody(endpointUpdate, "EndpointUpdate"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointOut"); } /** Delete an endpoint. */ @@ -135,9 +135,9 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - request.body = endpointPatch; + request.setBody(endpointPatch, "EndpointPatch"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointOut"); } /** Get the additional headers to be sent with the webhook. */ @@ -150,7 +150,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointHeadersOut"); } /** Set the additional headers to be sent with the webhook. */ @@ -166,7 +166,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - request.body = endpointHeadersIn; + request.setBody(endpointHeadersIn, "EndpointHeadersIn"); return request.sendNoResponseBody(this.requestCtx); } @@ -192,7 +192,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - request.body = endpointHeadersPatchIn; + request.setBody(endpointHeadersPatchIn, "EndpointHeadersPatchIn"); return request.sendNoResponseBody(this.requestCtx); } @@ -224,9 +224,9 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = recoverIn; + request.setBody(recoverIn, "RecoverIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "RecoverOut"); } /** @@ -249,9 +249,9 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = replayIn; + request.setBody(replayIn, "ReplayIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ReplayOut"); } /** @@ -269,7 +269,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointSecretOut"); } /** @@ -291,7 +291,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = endpointSecretRotateIn; + request.setBody(endpointSecretRotateIn, "EndpointSecretRotateIn"); return request.sendNoResponseBody(this.requestCtx); } @@ -311,9 +311,9 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = eventExampleIn; + request.setBody(eventExampleIn, "EventExampleIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "MessageOut"); } /** Get basic statistics for the endpoint. */ @@ -332,7 +332,7 @@ export class Endpoint { request.setQueryParam("since", options?.since); request.setQueryParam("until", options?.until); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointStats"); } /** Get the transformation code associated with this endpoint. */ @@ -348,7 +348,7 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EndpointTransformationOut"); } /** Set or unset the transformation code associated with this endpoint. */ @@ -364,12 +364,12 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - request.body = endpointTransformationIn; + request.setBody(endpointTransformationIn, "EndpointTransformationIn"); return request.sendNoResponseBody(this.requestCtx); } - public async oauthUpdate( + public oauthUpdate( appId: string, endpointId: string, endpointOauthConfigIn: EndpointOauthConfigIn @@ -381,12 +381,12 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - request.body = endpointOauthConfigIn; + request.setBody(endpointOauthConfigIn, "EndpointOauthConfigIn"); - await request.send(this.requestCtx); + return request.sendNoResponseBody(this.requestCtx); } - public async oauthDelete(appId: string, endpointId: string): Promise { + public oauthDelete(appId: string, endpointId: string): Promise { const request = new SvixRequest( HttpMethod.DELETE, "/app/{app_id}/endpoint/{endpoint_id}/oauth" @@ -395,6 +395,6 @@ export class Endpoint { request.setPathParam("app_id", appId); request.setPathParam("endpoint_id", endpointId); - await request.send(this.requestCtx); + return request.sendNoResponseBody(this.requestCtx); } } diff --git a/javascript/src/api/event_type.ts b/javascript/src/api/event_type.ts index b2fe8a5db..ca5a13dae 100644 --- a/javascript/src/api/event_type.ts +++ b/javascript/src/api/event_type.ts @@ -43,7 +43,7 @@ export class EventType { request.setQueryParam("include_archived", options?.includeArchived); request.setQueryParam("with_content", options?.withContent); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseEventTypeOut"); } /** @@ -57,9 +57,9 @@ export class EventType { const request = new SvixRequest(HttpMethod.POST, "/api/v1/event-type"); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = eventTypeIn; + request.setBody(eventTypeIn, "EventTypeIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EventTypeOut"); } /** @@ -76,9 +76,9 @@ export class EventType { const request = new SvixRequest(HttpMethod.POST, "/api/v1/event-type/import/openapi"); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = eventTypeImportOpenApiIn; + request.setBody(eventTypeImportOpenApiIn, "EventTypeImportOpenApiIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EventTypeImportOpenApiOut"); } /** Get an event type. */ @@ -90,7 +90,7 @@ export class EventType { request.setPathParam("event_type_name", eventTypeName); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EventTypeOut"); } /** Update an event type. */ @@ -104,9 +104,9 @@ export class EventType { ); request.setPathParam("event_type_name", eventTypeName); - request.body = eventTypeUpdate; + request.setBody(eventTypeUpdate, "EventTypeUpdate"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EventTypeOut"); } /** @@ -140,8 +140,8 @@ export class EventType { ); request.setPathParam("event_type_name", eventTypeName); - request.body = eventTypePatch; + request.setBody(eventTypePatch, "EventTypePatch"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "EventTypeOut"); } } diff --git a/javascript/src/api/integration.ts b/javascript/src/api/integration.ts index d435b5000..02caaa7b0 100644 --- a/javascript/src/api/integration.ts +++ b/javascript/src/api/integration.ts @@ -34,7 +34,7 @@ export class Integration { request.setQueryParam("iterator", options?.iterator); request.setQueryParam("order", options?.order); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseIntegrationOut"); } /** Create an integration. */ @@ -47,9 +47,9 @@ export class Integration { request.setPathParam("app_id", appId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = integrationIn; + request.setBody(integrationIn, "IntegrationIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "IntegrationOut"); } /** Get an integration. */ @@ -62,7 +62,7 @@ export class Integration { request.setPathParam("app_id", appId); request.setPathParam("integ_id", integId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "IntegrationOut"); } /** Update an integration. */ @@ -78,9 +78,9 @@ export class Integration { request.setPathParam("app_id", appId); request.setPathParam("integ_id", integId); - request.body = integrationUpdate; + request.setBody(integrationUpdate, "IntegrationUpdate"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "IntegrationOut"); } /** Delete an integration. */ @@ -110,7 +110,7 @@ export class Integration { request.setPathParam("app_id", appId); request.setPathParam("integ_id", integId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "IntegrationKeyOut"); } /** Rotate the integration's key. The previous key will be immediately revoked. */ @@ -128,6 +128,6 @@ export class Integration { request.setPathParam("integ_id", integId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "IntegrationKeyOut"); } } diff --git a/javascript/src/api/message.ts b/javascript/src/api/message.ts index 362b730e6..7e38ea932 100644 --- a/javascript/src/api/message.ts +++ b/javascript/src/api/message.ts @@ -57,7 +57,7 @@ export class Message { request.setQueryParam("tag", options?.tag); request.setQueryParam("event_types", options?.eventTypes); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseMessageOut"); } /** @@ -80,9 +80,9 @@ export class Message { request.setPathParam("app_id", appId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = messageIn; + request.setBody(messageIn, "MessageIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "MessageOut"); } /** Get a message by its ID or eventID. */ @@ -97,7 +97,7 @@ export class Message { request.setPathParam("msg_id", msgId); request.setQueryParam("with_content", options?.withContent); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "MessageOut"); } /** diff --git a/javascript/src/api/message_attempt.ts b/javascript/src/api/message_attempt.ts index 3e0807ff2..a1a162652 100644 --- a/javascript/src/api/message_attempt.ts +++ b/javascript/src/api/message_attempt.ts @@ -146,7 +146,7 @@ export class MessageAttempt { request.setQueryParam("with_msg", options?.withMsg); request.setQueryParam("event_types", options?.eventTypes); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseMessageAttemptOut"); } /** @@ -181,7 +181,7 @@ export class MessageAttempt { request.setQueryParam("with_content", options?.withContent); request.setQueryParam("event_types", options?.eventTypes); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseMessageAttemptOut"); } /** @@ -216,7 +216,7 @@ export class MessageAttempt { request.setQueryParam("with_content", options?.withContent); request.setQueryParam("event_types", options?.eventTypes); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseEndpointMessageOut"); } /** `msg_id`: Use a message id or a message `eventId` */ @@ -234,7 +234,7 @@ export class MessageAttempt { request.setPathParam("msg_id", msgId); request.setPathParam("attempt_id", attemptId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "MessageAttemptOut"); } /** @@ -277,7 +277,7 @@ export class MessageAttempt { request.setQueryParam("limit", options?.limit); request.setQueryParam("iterator", options?.iterator); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseMessageEndpointOut"); } /** Resend a message to the specified endpoint. */ diff --git a/javascript/src/api/operational_webhook_endpoint.ts b/javascript/src/api/operational_webhook_endpoint.ts index 82ad5c935..a77758e76 100644 --- a/javascript/src/api/operational_webhook_endpoint.ts +++ b/javascript/src/api/operational_webhook_endpoint.ts @@ -36,7 +36,7 @@ export class OperationalWebhookEndpoint { request.setQueryParam("iterator", options?.iterator); request.setQueryParam("order", options?.order); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "ListResponseOperationalWebhookEndpointOut"); } /** Create an operational webhook endpoint. */ @@ -50,9 +50,9 @@ export class OperationalWebhookEndpoint { ); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = operationalWebhookEndpointIn; + request.setBody(operationalWebhookEndpointIn, "OperationalWebhookEndpointIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "OperationalWebhookEndpointOut"); } /** Get an operational webhook endpoint. */ @@ -64,7 +64,7 @@ export class OperationalWebhookEndpoint { request.setPathParam("endpoint_id", endpointId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "OperationalWebhookEndpointOut"); } /** Update an operational webhook endpoint. */ @@ -78,9 +78,9 @@ export class OperationalWebhookEndpoint { ); request.setPathParam("endpoint_id", endpointId); - request.body = operationalWebhookEndpointUpdate; + request.setBody(operationalWebhookEndpointUpdate, "OperationalWebhookEndpointUpdate"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "OperationalWebhookEndpointOut"); } /** Delete an operational webhook endpoint. */ @@ -109,7 +109,7 @@ export class OperationalWebhookEndpoint { request.setPathParam("endpoint_id", endpointId); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "OperationalWebhookEndpointSecretOut"); } /** @@ -129,7 +129,10 @@ export class OperationalWebhookEndpoint { request.setPathParam("endpoint_id", endpointId); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = operationalWebhookEndpointSecretIn; + request.setBody( + operationalWebhookEndpointSecretIn, + "OperationalWebhookEndpointSecretIn" + ); return request.sendNoResponseBody(this.requestCtx); } diff --git a/javascript/src/api/statistics.ts b/javascript/src/api/statistics.ts index ca1a68621..657f1a29b 100644 --- a/javascript/src/api/statistics.ts +++ b/javascript/src/api/statistics.ts @@ -19,9 +19,9 @@ export class Statistics { const request = new SvixRequest(HttpMethod.POST, "/api/v1/stats/usage/app"); request.setHeaderParam("idempotency-key", options?.idempotencyKey); - request.body = appUsageStatsIn; + request.setBody(appUsageStatsIn, "AppUsageStatsIn"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "AppUsageStatsOut"); } /** @@ -33,6 +33,6 @@ export class Statistics { public aggregateEventTypes(): Promise { const request = new SvixRequest(HttpMethod.PUT, "/api/v1/stats/usage/event-types"); - return request.send(this.requestCtx); + return request.send(this.requestCtx, "AggregateEventTypesOut"); } } diff --git a/javascript/src/request.ts b/javascript/src/request.ts index 745e5d4c5..2c740ecde 100644 --- a/javascript/src/request.ts +++ b/javascript/src/request.ts @@ -1,8 +1,10 @@ import "svix-fetch"; import { ApiException } from "./util"; import { HttpErrorOut, HTTPValidationError } from "./openapi"; +import { ObjectSerializer } from "./openapi/models/ObjectSerializer"; const LIB_VERSION = "1.56.0"; +const USER_AGENT = `svix-libs/${LIB_VERSION}/javascript`; export enum HttpMethod { GET = "GET", @@ -31,7 +33,7 @@ export class SvixRequest { private path: string ) {} - public body?: any; + private body?: string; private queryParams: Record = {}; private headerParams: Record = {}; @@ -71,6 +73,10 @@ export class SvixRequest { this.headerParams[name] = value; } + public setBody(value: any, type: string) { + this.body = JSON.stringify(ObjectSerializer.serialize(value, type, "")); + } + /** * Send this request, returning the request body as a caller-specified type. * @@ -80,9 +86,9 @@ export class SvixRequest { * If the server returns a 5xx error, the request is retried up to two times with exponential backoff. * If retries are exhausted, an `ApiException` is thrown. */ - public async send(ctx: SvixRequestContext): Promise { + public async send(ctx: SvixRequestContext, responseType: string): Promise { const responseBody = await this.sendInner(ctx); - return JSON.parse(responseBody); + return ObjectSerializer.deserialize(JSON.parse(responseBody), responseType, ""); } /** Same as `send`, but the response body is discarded, not parsed. */ @@ -98,11 +104,6 @@ export class SvixRequest { const randomId = Math.floor(Math.random() * Math.pow(2, 32)); - let body: string | undefined; - if (this.body !== undefined) { - body = JSON.stringify(this.body); - } - // Cloudflare Workers fail if the credentials option is used in a fetch call. // This work around that. Source: // https://github.com/cloudflare/workers-sdk/issues/2514#issuecomment-2178070014 @@ -110,10 +111,10 @@ export class SvixRequest { const response = await sendWithRetry(url, { method: this.method.toString(), - body, + body: this.body, headers: { accept: "application/json, */*;q=0.8", - "user-agent": `svix-libs/${LIB_VERSION}/javascript`, + "user-agent": USER_AGENT, "svix-req-id": randomId.toString(), ...this.headerParams, },