diff --git a/src/core/http.ts b/src/core/http.ts index 9685aff..34817e9 100644 --- a/src/core/http.ts +++ b/src/core/http.ts @@ -29,19 +29,19 @@ export class HttpHandler { this.#baseUrl = props.urlEndpoint ?? DefaultEndpoint } - async get(path: string, data?: unknown): Promise { + async get(path: string, data?: unknown): Promise { return this.#request('GET', path, data) } - async post(path: string, data?: unknown): Promise { + async post(path: string, data?: unknown): Promise { return this.#request('POST', path, data) } - async delete(path: string, data?: unknown): Promise { + async delete(path: string, data?: unknown): Promise { return this.#request('DELETE', path, data) } - async #request(method: HttpMethod, path: string, data?: unknown): Promise { + async #request(method: HttpMethod, path: string, data?: unknown): Promise { const url = `${this.#baseUrl}/client/${path}` try { @@ -65,17 +65,22 @@ export class HttpHandler { } } - async #handleResponse(response: Response): Promise { + async #handleResponse(response: Response): Promise { if (!response.ok) { throw await this.#mapError(response) } + const contentLength = response.headers.get('content-length') + if (contentLength === '0') { + return undefined + } + const contentType = response.headers.get('content-type') if (!contentType || !contentType.includes('application/json')) { - return undefined as T + return undefined } - return response.json() as Promise + return response.json() } async #mapError(response: Response): Promise { diff --git a/src/core/resources/base.ts b/src/core/resources/base.ts index 5f418bf..d1c05df 100644 --- a/src/core/resources/base.ts +++ b/src/core/resources/base.ts @@ -9,15 +9,15 @@ export abstract class BaseResource { protected abstract readonly endpoint: string - protected async get(data?: unknown): Promise { + protected async get(data?: unknown): Promise { return this.#http.get(this.endpoint, data) } - protected async post(data?: unknown, pathOverride?: string): Promise { + protected async post(data?: unknown, pathOverride?: string): Promise { return this.#http.post(pathOverride ?? this.endpoint, data) } - protected async remove(data?: unknown, pathOverride?: string): Promise { + protected async remove(data?: unknown, pathOverride?: string): Promise { return this.#http.delete(pathOverride ?? this.endpoint, data) } } diff --git a/src/core/resources/organizations/events.ts b/src/core/resources/organizations/events.ts index 8e7face..6a70c85 100644 --- a/src/core/resources/organizations/events.ts +++ b/src/core/resources/organizations/events.ts @@ -8,7 +8,7 @@ export class OrganizationEventsResource extends BaseResource { * Posts organization events for asynchronous processing. * @param data - Array of organization events */ - async post(data: OrganizationEvent[]): Promise { - return super.post(data) + async post(data: OrganizationEvent[]): Promise { + return super.post(data) } } diff --git a/src/core/resources/organizations/organization.ts b/src/core/resources/organizations/organization.ts index 19b291a..10c370b 100644 --- a/src/core/resources/organizations/organization.ts +++ b/src/core/resources/organizations/organization.ts @@ -26,8 +26,8 @@ export class OrganizationResource extends BaseResource { * @param data - Organization data including identifier, name, data, etc. * @returns Promise resolving to the created/updated organization */ - async upsert(data: OrganizationRequest): Promise { - return this.post(data) + async upsert(data: OrganizationRequest): Promise { + return this.post(data) } /** @@ -36,7 +36,7 @@ export class OrganizationResource extends BaseResource { * @returns Promise resolving when organization is deleted */ async delete(data: DeleteOrganizationRequest): Promise { - return this.remove(data) + return this.remove(data) } /** @@ -45,7 +45,7 @@ export class OrganizationResource extends BaseResource { * @returns Promise resolving when user is added */ async addUser(data: OrganizationUserRequest): Promise { - return this.post(data, 'organizations/users') + return this.post(data, 'organizations/users') } /** @@ -54,6 +54,6 @@ export class OrganizationResource extends BaseResource { * @returns Promise resolving when user is removed */ async removeUser(data: RemoveOrganizationUserRequest): Promise { - return this.remove(data, 'organizations/users') + return this.remove(data, 'organizations/users') } } diff --git a/src/core/resources/organizations/scheduled.ts b/src/core/resources/organizations/scheduled.ts index af2f77d..97d7f1f 100644 --- a/src/core/resources/organizations/scheduled.ts +++ b/src/core/resources/organizations/scheduled.ts @@ -16,8 +16,8 @@ export class OrganizationScheduledResource extends BaseResource { * @param data - Scheduled resource data including name, identifier, scheduledAt, interval, etc. * @returns Promise resolving to the accepted scheduled resource */ - async upsert(data: UpsertOrganizationScheduledRequest): Promise { - return this.post(data) + async upsert(data: UpsertOrganizationScheduledRequest): Promise { + return this.post(data) } /** @@ -26,6 +26,6 @@ export class OrganizationScheduledResource extends BaseResource { * @returns Promise resolving when scheduled resource is deleted */ async delete(data: DeleteOrganizationScheduledRequest): Promise { - return this.remove(data) + return this.remove(data) } } diff --git a/src/core/resources/users/events.ts b/src/core/resources/users/events.ts index 39c3c48..31b0d65 100644 --- a/src/core/resources/users/events.ts +++ b/src/core/resources/users/events.ts @@ -8,7 +8,7 @@ export class UserEventsResource extends BaseResource { * Posts user events for asynchronous processing. * @param data - Array of user events */ - async post(data: UserEvent[]): Promise { - return super.post(data) + async post(data: UserEvent[]): Promise { + return super.post(data) } } diff --git a/src/core/resources/users/scheduled.ts b/src/core/resources/users/scheduled.ts index bc033af..a25a597 100644 --- a/src/core/resources/users/scheduled.ts +++ b/src/core/resources/users/scheduled.ts @@ -16,8 +16,8 @@ export class UserScheduledResource extends BaseResource { * @param data - Scheduled resource data including name, identifier, scheduledAt, interval, etc. * @returns Promise resolving to the accepted scheduled resource */ - async upsert(data: UpsertUserScheduledRequest): Promise { - return this.post(data) + async upsert(data: UpsertUserScheduledRequest): Promise { + return this.post(data) } /** @@ -26,6 +26,6 @@ export class UserScheduledResource extends BaseResource { * @returns Promise resolving when scheduled resource is deleted */ async delete(data: DeleteUserScheduledRequest): Promise { - return this.remove(data) + return this.remove(data) } } diff --git a/src/core/resources/users/user.ts b/src/core/resources/users/user.ts index 5af36fb..e72abc8 100644 --- a/src/core/resources/users/user.ts +++ b/src/core/resources/users/user.ts @@ -24,8 +24,8 @@ export class UserResource extends BaseResource { * @param data - User data including identifier, email, phone, etc. * @returns Promise resolving to the created/updated user */ - async upsert(data: UpsertUserRequest): Promise { - return this.post(data) + async upsert(data: UpsertUserRequest): Promise { + return this.post(data) } /** @@ -34,6 +34,6 @@ export class UserResource extends BaseResource { * @returns Promise resolving when user is deleted */ async delete(data: DeleteUserRequest): Promise { - return this.remove(data) + return this.remove(data) } } diff --git a/src/platform/browser.ts b/src/platform/browser.ts index 99e068c..91c11e0 100644 --- a/src/platform/browser.ts +++ b/src/platform/browser.ts @@ -24,14 +24,14 @@ class BrowserUserEventsResource extends UserEventsResource { this.#getIdentifier = getIdentifier } - async post(data: UserEvent[]): Promise { + async post(data: UserEvent[]): Promise { const identifier = this.#getIdentifier() const injected = data.map((event) => ({ ...event, // Do not inject identifier when `match` is used (they are mutually exclusive) identifier: event.match ? event.identifier : (event.identifier ?? identifier), })) - return super.post(injected) as Promise + return super.post(injected) } } @@ -43,7 +43,7 @@ class BrowserUserScheduledResource extends UserScheduledResource { this.#getIdentifier = getIdentifier } - async upsert(data: UpsertUserScheduledRequest): Promise { + async upsert(data: UpsertUserScheduledRequest): Promise { return super.upsert({ ...data, identifier: data.identifier ?? this.#getIdentifier(), @@ -113,7 +113,7 @@ class BrowserUserResource extends UserResource { return identifier } - async upsert(data: UpsertUserRequest): Promise { + async upsert(data: UpsertUserRequest): Promise { const identifier = this.#buildIdentifier(data.identifier) return super.upsert({ ...data, identifier }) }