npm package diff

Package: @forge/events

Versions: 1.0.3-next.0 - 1.0.3-next.0-experimental-f44d099

File: package/src/appEvents.ts

Index: package/src/appEvents.ts
===================================================================
--- package/src/appEvents.ts
+++ package/src/appEvents.ts
@@ -0,0 +1,81 @@
+import { post } from './queries';
+import { __requestAtlassianAsApp } from '@forge/api';
+
+export interface AppEvent {
+  key: string;
+}
+
+export type AppEventResult = AppEventSuccess | AppEventError;
+
+export type AppEventSuccess = {
+  type: 'success';
+};
+
+export interface AppEventError {
+  type: 'error';
+  errorType: AppEventErrorType;
+  errorMessage: string;
+}
+
+export type AppEventErrorType =
+  | 'VALIDATION_ERROR'
+  | 'AUTHENTICATION_ERROR'
+  | 'AUTHORIZATION_ERROR'
+  | 'RATE_LIMIT'
+  | 'SERVICE_ERROR'
+  | 'SERVICE_UNAVAILABLE'
+  | `OTHER`;
+
+interface AppEventErrorResponse {
+  errorMessages: string[];
+  errors: Map<string, string>;
+}
+
+const errorTypes: Record<number, AppEventErrorType> = {
+  400: 'VALIDATION_ERROR',
+  401: 'AUTHENTICATION_ERROR',
+  403: 'AUTHORIZATION_ERROR',
+  429: 'RATE_LIMIT',
+  500: 'SERVICE_ERROR',
+  503: 'SERVICE_UNAVAILABLE'
+};
+
+const endpoint = '/forge/events/v1/app-events';
+
+export const appEvents = {
+  async publish(events: AppEvent | AppEvent[]): Promise<AppEventResult> {
+    const eventsArray = Array.isArray(events) ? events : [events];
+    const body = {
+      events: eventsArray.map((e) => ({
+        eventKey: e.key
+      }))
+    };
+
+    const response = await post(endpoint, body, __requestAtlassianAsApp);
+
+    if (!response.ok) {
+      const responseBody = await response.json();
+      return {
+        type: 'error',
+        errorType: errorTypes[response.status] ?? 'OTHER',
+        errorMessage: getErrorMessage(responseBody)
+      };
+    }
+
+    return {
+      type: 'success'
+    };
+  }
+};
+
+function getErrorMessage(responseBody: AppEventErrorResponse) {
+  if (responseBody.errorMessages && responseBody.errorMessages.length > 0) {
+    return responseBody.errorMessages.join(', ');
+  } else if (responseBody.errors) {
+    return Object.entries(responseBody.errors)
+      .map(([key, value]) => `${key}: ${value}`)
+      .join(', ');
+  } else {
+    return JSON.stringify(responseBody);
+  }
+}