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);
+ }
+}